Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Строки, массивы строк...

Ответить
Настройки темы
C/C++ - Строки, массивы строк...

Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Каким образом в С работать со строками? (не массивами из символов)
Там вроде есть какой-то ньюанс, в отличие от Java, эти конструкции не очень-то работают:
Код: Выделить весь код
String name = "********";
String[] name = new String [namesCnt];
Как же всё-таки создать переменную типа String в C? Массив из переменных типа String?

Отправлено: 15:21, 18-04-2010

 

Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Цитата ManHack:
Каким образом в С работать со строками? (не массивами из символов) »
Если в C, то только с массивом символов.
Если в C++, то подключаем заголовочный #include <string> и работаем.
Код: Выделить весь код
#include <iostream>
#include <string>
using namepsace std;
int main()
{
    string str = "blablabla";
    string *str2 = new string[100]; //сто строк
    str2[0] = "str0";
    str2[1] = "str1";
    ....
    delete [] str2;
}

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:50, 18-04-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Ясно, спасибо... как тогда будет выглядеть объявление массива из массивов из символов в Cи?
А каким образом можно сравнивать массивы из символов? (аналогично String.compareTo() в Java)

Отправлено: 16:05, 18-04-2010 | #3


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Цитата ManHack:
как тогда будет выглядеть объявление массива из массивов из символов в Cи? »
Код: Выделить весь код
char str_array[100][1024]; //сто строк длиной 1024
Цитата ManHack:
А каким образом можно сравнивать массивы из символов? »
Есть функция int strcmp(const char *str1, const char *str2); (из string.h). Возвращает 0 если строки одинаковые, -1 если первая меньше, 1 если первая больше.
Код: Выделить весь код
if(strcmp("str1", "str1") == 0) printf("Одинаковые");

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:45, 18-04-2010 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


что понимается под массивом из String? в c/с++ нет класса String. Строки в С, а по наследству и в С++ представляются массивом сз элементов типа char или wchar_t, но в стандартной библиотеке C++, в пространстве имён std есть класс string, который удовлетворяет большинство потребностей в строках. Можно придумать свой класс String, работающий по собственным правилам (например это сделал borland, объявив классы AnsiString и WideString), но это излишне, если допускается использование std::string.
Теперь о массиве. Вообще конструкция
Код: Выделить весь код
#include <string>
using namespace std;
...
string str_array[100];
допустима, но в стандартной библиотеке есть контейнер vector, позволяющий хранить объекты в виде массива и контейнер list, позволяющий хранить объекты в 2-связном списке. Таким образом, в зависимости от задумки автора, можно поступит двояко:
Цитата ManHack:
Код:
String name = "********";
String[] name = new String [namesCnt]; »
Код: Выделить весь код
// случайный доступ к элементам
vector<string> str_arr1(str_num); // str_num пустых строк
vector<string> str_arr2(str_num, string("********")); // str_num строк, инициализированных в "********"

// только последовательный доступ
list<string> str_list0; // пустой список строк 
list<string> str_list1(str_num); // str_num пустых строк
list<string> str_list2(str_num, string("********")); // str_num строк, инициализированных в "********"
Кроме того, в зависимости от задачи, можно использовать и другие контейнеры.
Для сравнения строк переопределён оператор==(string const&, string const&), для сравнения контейнеров то же самое сделано для контейнеров. То есть:
Код: Выделить весь код
clog << (str_arr1==str_arr2 ? "Векторы равны" : "Есть различия") << endl;
Теперь по поводу C: Далее буду считать, что автор темы отличает C от C++.
Управление хранилищем полностью отводится на откуп прогаммиста. Поэтому надо заранее позаботиться о выделении и уничтожении памяти. Класса String в C нет. Вместо этого есть массив из char, в конце которого символ с кодом 0. Для сравнения строк функции strcmp, strcmpi или любая самописная, которая сравнивает поэлементно до тех пор, пока не встретит код 0. Сравнение массивов только самописное или не из стандартной библиотеки C.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:45, 18-04-2010 | #5


Аватара для otkryto

Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте!
Скажите пожалуйста как на обычном Си реализовать такое
В соревнованиях по прыжкам в длину принимают участие 10 спортсменов. Считая заданным список фамилий
спортсменов и их результаты в порядке стартовых номеров, получить итоговую таблицу, в которой содержатся
фамилии и результаты в порядке занятых мест.
не пойму как массивы строку работают, вылезает ошибка Null pointer assignment либо просто закрывается окно

Код: Выделить весь код
#include <stdio.h> #include <iostream.h> #include <iomanip.h> #include <string.h>
main()
{ 
int r[10]; 
char *m[10]; 
int i,j,n;
char *s;
for(i=0; i<=9; i++) 
{ 
cout<<"Vvedite familijy uchastnika";
 cin>>m[i];
 cout<<"Vvedite rezultat uchastnika"<<endl;
 cin>>r[i]; } cout<<endl<<endl; 

printf("Vveden \n"); 
for(i=0; i<=9; i++) 
{
 cout<<m[i]<<" ";
 cout<<r[i]<<" "<<endl; 
}  

printf("\n");
 printf("\n");

 for(i=0; i<=8; i++)
 { 
   for(j=i; j<=9; j++) 
    {
      if (r[i]<r[j]) 
      { 
       n=r[j];
       r[j]=r[i];
       r[i]=n;

      s=m[j]; 
      m[j]=m[i];
      m[i]=s; 
     } 
    }
  }
 printf("Otvet \n");
 cout <<endl;
 for(i=0; i<=9; i++) 
{
 cout<<m[i]<<" ";
 cout<<r[i]<<" "<<endl; 
} return 0; }

Отправлено: 18:36, 27-04-2011 | #6


ИО Капитана Очевидности


Contributor


Сообщения: 5383
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Цитата otkryto:
не пойму как массивы строку работают, вылезает ошибка Null pointer assignment либо просто закрывается окно »
Объясняю. char* - это не "массив строк", а указатель на объект типа "символ" (число, означающее код символа). Просто по правилам языка С указатель на начальный объект массива одновременно является указателем на сам массив (со смещением в 0 байт).

Код: Выделить весь код
// в коде программы
const char *Stroka = "Hello Word"; 
// в отладчике
Значение Stroka будет равна "Hello Word\0"
Значения *Stroka и Stoka[0] будут равны 'H'
Значения *(Stroka+1) и Stroka[1] будут равны 'e'
Вот только указатель - это всего-лишь число, означающее адрес оперативной памяти, по которому расположена указываемая информация. Чтобы начать работу с информацией, нужно сначала выделить область памяти нужного размера, а по завершении работы - освободить.

В С нет объекта "строка" - есть "массив символов, оканчивающийся нулём" (символом с кодом "ноль"), который компилятором и отладчиком обрабатывается особым образом, создавая over 9000 проблем любому начинающему программисту.
У меня сейчас нет времени полноценную лекцию по данной теме писать, ибо она слишком большая и сложная. Придётся послать вас в гугль

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 06:31, 29-04-2011 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Строки, массивы строк...

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Массивы+функция JamesB Программирование и базы данных 1 01-04-2010 22:16
MySQL - Автозамена строки из другой строки - trigger? procedure ? BugZZ Программирование и базы данных 0 18-09-2009 09:51
C/C++ - Массивы SS3 Программирование и базы данных 3 29-04-2009 21:47
Массивы в С++ Guest Программирование и базы данных 2 27-09-2004 10:12
C++ и массивы ? IG Программирование и базы данных 9 09-06-2003 09:33




 
Переход