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

Сравнение строк (символьные массивы), игнорируя регистровые различия - C++

Восстановить пароль Регистрация
 
PadawanC
1 / 1 / 0
Регистрация: 22.07.2013
Сообщений: 19
22.07.2013, 21:58     Сравнение строк (символьные массивы), игнорируя регистровые различия #1
Я недавно начал изучать С++ и все не как не пойму что не так с моей программой... Задача: Напишите программу, которая предлагает пользователю ввести две строки, а затем сравнивает их, игнорируя "регистровые" различия, т.е. прописные и строчные буквы ваша программа должна воспринимать как одинаковые.
Проблема с самим сравнением, в результате получается что строка 1 всегда больше 2, но если они ровны то выводится сообщение "Строки ровны". Вроде по синтаксису все нормально, подскажите, пожалуйста, где я накасячил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cctype>
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,"Russian");
    system("cls");
 
    char str1[30],str2[30];
    int i;
 
    cout << "Введите строку 1 (до 29 символов): ";
    gets(str1);
    cout << "\n";
 
    cout << "Введите строку 2 (до 29 символов): ";
    gets(str2);
    cout << "\n\n";
    
    for (i=0; str1[i]; i++) if (isupper(str1[i])) str1[i]= tolower(str1[i]);
 
    for (i=0; str2[i]; i++) if (isupper(str2[i])) str2[i]= tolower(str2[i]);
 
    cout << "Строка 1 после обработки: " << str1 << "\n\n";
    cout << "Строка 2 после обработки: " << str2 << "\n\n";
 
    if (strcmp(str1,str2)) cout << "Строка 1 больше строки 2"; 
    else if (strcmp(str2,str1)) cout << "Строка 2 больше строки 1"; 
    else cout << "Строки ровны";
 
getchar();
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2013, 21:58     Сравнение строк (символьные массивы), игнорируя регистровые различия
Посмотрите здесь:

Двумерные массивы (+символьные) C++
C++ Символьные массивы
C++ Функция сравнивает две строки, игнорируя различия в регистрах
C++ Регистровые переменные
C++ функция getline считывает несколько строк из файла, игнорируя символ новой строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.07.2013, 22:01     Сравнение строк (символьные массивы), игнорируя регистровые различия #2
Цитата Сообщение от PadawanC Посмотреть сообщение
C++
1
2
if (strcmp(str1,str2)) cout << "Строка 1 больше строки 2"; 
else if (strcmp(str2,str1)) cout << "Строка 2 больше строки 1";
ты доки к strcmp внимательно читал? прочитай ещё раз
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.07.2013, 22:12     Сравнение строк (символьные массивы), игнорируя регистровые различия #3
Цитата Сообщение от Jupiter Посмотреть сообщение
ты доки к strcmp внимательно читал?
А если по теме, то сразу про stricmp. Хотя ТСу ж надо рукописный вариант.
PadawanC
1 / 1 / 0
Регистрация: 22.07.2013
Сообщений: 19
22.07.2013, 22:14  [ТС]     Сравнение строк (символьные массивы), игнорируя регистровые различия #4
Все, понял, в 3 часа ночи кателок не варит вообще...пора спать.... Исправил, все заработала. Спасибо
C++
1
2
3
if (!strcmp(str1,str2)) cout << "Строки ровны"; 
    else if (strcmp(str1,str2)<0) cout << "Строка 1 больше строки 2"; 
    else cout << "Строка 2 больше строки 1";
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.07.2013, 08:14     Сравнение строк (символьные массивы), игнорируя регистровые различия #5
Цитата Сообщение от PadawanC Посмотреть сообщение
Все, понял,.... Исправил, все заработала.
так регистровые различия не будут игнорироваться, так что задачу еще не решили. При таком раскладе ваша программа определит, что "AA" < "aa", но должно быть "AA" == "aa"
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.07.2013, 11:14     Сравнение строк (символьные массивы), игнорируя регистровые различия #6
Thinker, А код ПЕРЕД strcmp посмотреть?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.07.2013, 11:59     Сравнение строк (символьные массивы), игнорируя регистровые различия #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Thinker, А код ПЕРЕД strcmp посмотреть?

Не по теме:

да, невнимательный

h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
31.07.2013, 11:42     Сравнение строк (символьные массивы), игнорируя регистровые различия #8
Подкажите, насколько я понимаю это задача из книги Шилдта?
Я тоже сейчас пытаюсь учится по данной книги и решаю как раз аналогичную задачу. Решил таким именно алгоритмом. Подскажите насколько он ВЕРЕН с точки зрения опытных программистов, то есть насколько оптимален. Можно ли данную задачу решить короче, лучше?

Вот как я решил:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <clocale>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    setlocale(LC_CTYPE, "");
 
    char str1[80], str2[80];
    char *s1, *s2;
 
    s1=NULL;
    s2=NULL;
 
    s1=str1;
    s2=str2;
 
    cout<< "Введите первую строку: ";
    gets(str1);
    cout<< "Введите вторую строку: ";
    gets(str2);
 
    for (int i=0; s1[i]; i++)
    {
        if(isupper(s1[i]))
            {
                s1[i]=tolower(s1[i]);
            }
    }
 
    for(int i=0; s2[i]; i++)
    {
        if(isupper(s2[i]))
            {
                s2[i]=tolower(s2[i]);
            }
    }
 
    cout<<str1<<endl;
    cout<<str2<<endl;
 
    if(!strcmp(str1,str2)){cout<<"Строки равны";}
    else if (str1,str2>0) {cout<<"Строка 1 больше строки 2";}
    else {cout<<"Строка 2 больше строки 1";}
 
    return 0;
}
Добавлено через 20 часов 25 минут
Нашел еще и вот такое решение, вариант короче и красивше как мне кажется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
    setlocale(LC_CTYPE, "");
 
    char str1[80], str2[80];
    int i=0;
 
    cout<<"введите первую строку: ";
    gets(str1);
    cout<<"Введите вторую строку: ";
    gets(str2);
 
    while(str1[i] && str2[i])                                  //данный цикл проверяет на совпадения посимвольно строки
    {
        if(tolower(str1[i])!=tolower(str2[i])) break;   /*если символы преобразованные в нижний регистр не совпадут,
                                                                       то цикл прервется до завершающего нуля*/
        else i++;
    }
    if (!str1[i] && !str2[i]) cout<<"равны";            /*если в ячейках массива не нули то строки разные по длине, 
                                                                      а ,следовательно, не равны.*/
    else cout<< "не равны";
 
    return 0;
}
aLarman
31.07.2013, 11:57
  #9

Не по теме:

смайлик вместо ошибочно отправленного сообщения

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 11:59     Сравнение строк (символьные массивы), игнорируя регистровые различия
Еще ссылки по теме:

Символьные массивы C++
C++ Символьные массивы
Сравнить две строки на различия не учитывая кол-во пробелов и такие различия в буквах как о-и, н-т, в-д. C++

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

Или воспользуйтесь поиском по форуму:
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
31.07.2013, 11:59     Сравнение строк (символьные массивы), игнорируя регистровые различия #10
aLarman, по обоим пунктам я уже понял после нашей вчерашней беседы, но все равно спасибо большое за указания на ошибки!
Yandex
Объявления
31.07.2013, 11:59     Сравнение строк (символьные массивы), игнорируя регистровые различия
Ответ Создать тему
Опции темы

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