Форум программистов, компьютерный форум CyberForum.ru

Проверка на равенство двух строк C++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.64
NatalyPR
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 8
17.05.2013, 22:07     Проверка на равенство двух строк C++ #1
И так, с этим языком я знакома слабо, сейчас пишу курсач и мне нужна помощь реального человека, а не поисковых систем.

У меня есть структура

C
1
2
3
4
5
6
struct numbers{
    int ID;
    string type[20];
    string number[20];
    string country[20];
};
Так же у меня есть такой вот простенькой алгоритм поиска

C
1
2
3
4
5
6
7
8
printf("Введите номер телефона: ");
scanf("%s",TEMP_NUMBER);
for(int i=0;i<sizeNUM;i++)
       if(n[i].number==TEMP_NUMBER){
             PrintAll(&c[i],n,e,g,gc,sizeNUM,sizeE_MAILS,sizeGR,sizeGC);
         flag=false;
    }
       if(flag!=false)printf("Контакта с номером %s не существует",TEMP_NUMBER);
Проблема в условии на проверку равенства строк
пробовала: строка == строка - в этом случае он мне либо выдает все, либо ничего!
пробовала: strcmp - если у string в структуре не ставить [20], то все работает, но убирать я это не хочу по другой причине
пробовала: с дополнением .c_str() - опять же... с [20] хорошо, без плохо
пробовала: compare выдает ошибку

П.С. char не предлагать, так как его мне использовать нельзя !
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2013, 22:07     Проверка на равенство двух строк C++
Посмотрите здесь:

C++ Проверка двух текстовиков
C++ Проверка массива char на равенство с таким же массивом
Строка: Добавить в строковый класс функцию, которая создает строку, содержащую пересечение двух строк, то есть общие символы для двух строк. C++
Проверка на равенство буквы и элемента из массива C++
Побитовое увеличение числа на 1 и побитовая проверка на равенство C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
17.05.2013, 22:39     Проверка на равенство двух строк C++ #2
Цитата Сообщение от NatalyPR Посмотреть сообщение
string type[20];
string number[20];
string country[20];
По моему, это не строки из 20 символов, а массивы из 20 строк string, для каждой из которых вызывается конструктор по умолчанию
NatalyPR
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 8
17.05.2013, 22:53  [ТС]     Проверка на равенство двух строк C++ #3
Если я убираю [20], то он мне выдает ошибку такого рода
{ссылка удалена}

Причем хватало добавить [20] хотя бы в одной (любой структуре), как ошибка больше не срабатывала
После чего я решила, что проблема в том, что string слишком много места жрет и решила переделать все под это предполагая, что там он будет работать по подобию chara.

Добавлено через 55 секунд
Ссылка вроде не работает.
Вот содержание ошибки:

ERROR: Unhandled exception at 0x5885e42e (msvcr100d.dll) in ProyectC.exe: 0xC0000005: Access violation writing location 0x00000000.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
17.05.2013, 23:29     Проверка на равенство двух строк C++ #4
Цитата Сообщение от NatalyPR Посмотреть сообщение
Если я убираю [20], то он мне выдает ошибку такого рода
Скорее всего, вы используете строку как символьный массив не учитывая, что по умолчанию она имеет нулевой размер, например:
C++
1
2
std::string s;
s[0] = 'a'; // ошибка, строка имеет нулевой размер
Если вам нужны строки по 20 символов каждая, можно сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct numbers {
    
    int ID;
    string type;
    string number;
    string country;
 
    numbers()
    : type(20, 0),
      number(20, 0),
      country(20, 0) {
        
    }
};
NatalyPR
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 8
17.05.2013, 23:58  [ТС]     Проверка на равенство двух строк C++ #5
Спасибо!
Убрала [20], размер установила как и посоветовали.
Теперь проблема в другом!
Мне нужно скопировать структуру. Т.е. у меня есть 2 одинаковых массива(один из них временный) и мне надо скопировать из одного часть информации в другой.
Через = у меня не работает. Пробовала по полям, тоже не выходит

C
1
2
3
4
5
6
7
8
9
10
11
12
printf("Введите номер телефона для удаления: ");
scanf("%s",DELETE_NUM.c_str());
sizeNUM_TEMP=0;
    for(int i=0,j=0;i<sizeNUM;i++){
        if(strcmp(n[i].number.c_str(),DELETE_NUM.c_str())!=0){
            n_TEMP[j]=n[i]; 
            j++;
        }
            else sizeNUM_TEMP++;
    }
    sizeNUM-=sizeNUM_TEMP;
    for(int i=0;i<sizeNUM;i++) n[i]=n_TEMP[i];
Добавлено через 3 минуты
Скорее всего, вы используете строку как символьный массив не учитывая, что по умолчанию она имеет нулевой размер, например:
Код C++
1
2
std::string s;
s[0] = 'a'; // ошибка, строка имеет нулевой размер
А как это учесть?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,411
18.05.2013, 04:57     Проверка на равенство двух строк C++ #6
Цитата Сообщение от NatalyPR Посмотреть сообщение
надо скопировать из одного часть информации в другой.
если массивы состоят из объектов структуры или другого типа, где не определен оператор =, то будете получать ошибку. Нужно описать подробно как хотите это сделать для компилятора. Лучше всего определить оператор, но можно и просто в теле функции.
C
1
if(strcmp(n[i].number.c_str(),DELETE_NUM.c_str())!=0){
выкинуть и забыть. Если пользуетесь string, незачем приводить их к С массивам. Кстати у них (string) операторы == и = как раз определены.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2013, 12:54     Проверка на равенство двух строк C++
Еще ссылки по теме:

Проверка на равенство строк C++
C++ Проверка значения полинома на равенство нулю всегда дает ложь
C++ Проверка упорядоченности строк

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
18.05.2013, 12:54     Проверка на равенство двух строк C++ #7
Цитата Сообщение от NatalyPR Посмотреть сообщение
printf("Введите номер телефона для удаления: ");
scanf("%s",DELETE_NUM.c_str());
Так как вы сделали делать нельзя. Библиотеки доставшиеся C++ в наследие от C не умеют работать с вещами не свойственными этому языку. scanf можно использовать только для символьных(char) массивов(указатель возвращаемый c_str() является константным и предназначен только для чтения). На C++ вышеприведённый код будет выглядеть так
C++
1
2
cout << "Введите номер телефона для удаления: ";
cin >> DELETE_NUM;
Цитата Сообщение от NatalyPR Посмотреть сообщение
if(strcmp(n[i].number.c_str(),DELETE_NUM.c_str())!=0)
Здесь, как сказано постом выше, гораздо проще использовать опертор !=
C++
1
if(n[i].number != DELETE_NUM)
Строки
C++
1
2
3
4
5
6
    numbers()
    : type(20, 0),
      number(20, 0),
      country(20, 0) {
        
    }
очевидно можно убрать. И не называйте переменные именами полностью состоящими из больших букв, в C++ так принято называть макросы.
Yandex
Объявления
18.05.2013, 12:54     Проверка на равенство двух строк C++
Ответ Создать тему
Опции темы

Текущее время: 16:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru