Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
PadawanC
1 / 1 / 0
Регистрация: 22.07.2013
Сообщений: 25
1

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

22.07.2013, 21:58. Просмотров 1021. Ответов 9
Метки нет (Все метки)

Я недавно начал изучать С++ и все не как не пойму что не так с моей программой... Задача: Напишите программу, которая предлагает пользователю ввести две строки, а затем сравнивает их, игнорируя "регистровые" различия, т.е. прописные и строчные буквы ваша программа должна воспринимать как одинаковые.
Проблема с самим сравнением, в результате получается что строка 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2013, 21:58
Ответы с готовыми решениями:

Сравнение строк, игнорируя различия в регистре
Напишите программу, которая предлагает пользователю ввести две строки, а затем...

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

Символьные массивы. Сравнение с алфавитом
вечер добрый. задача такая: имеется символьный массив алфавитный(32...

Как сравнить две строки игнорируя различия в регистрах?
Дело в том, что нельзя использовать основные функции, в моей случае tolower, я...

Функция сравнивает две строки, игнорируя различия в регистрах
Я студент 1 курса на зачёт сказали написать программку помогите!! не хочу...

9
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 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 внимательно читал? прочитай ещё раз
1
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.07.2013, 22:12 3
Цитата Сообщение от Jupiter Посмотреть сообщение
ты доки к strcmp внимательно читал?
А если по теме, то сразу про stricmp. Хотя ТСу ж надо рукописный вариант.
1
PadawanC
1 / 1 / 0
Регистрация: 22.07.2013
Сообщений: 25
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";
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.07.2013, 08:14 5
Цитата Сообщение от PadawanC Посмотреть сообщение
Все, понял,.... Исправил, все заработала.
так регистровые различия не будут игнорироваться, так что задачу еще не решили. При таком раскладе ваша программа определит, что "AA" < "aa", но должно быть "AA" == "aa"
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.07.2013, 11:14 6
Thinker, А код ПЕРЕД strcmp посмотреть?
1
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.07.2013, 11:59 7
Цитата Сообщение от ForEveR Посмотреть сообщение
Thinker, А код ПЕРЕД strcmp посмотреть?

Не по теме:

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

0
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
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;
}
0
aLarman
31.07.2013, 11:57
  #9

Не по теме:

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

1
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
31.07.2013, 11:59 10
aLarman, по обоим пунктам я уже понял после нашей вчерашней беседы, но все равно спасибо большое за указания на ошибки!
0
31.07.2013, 11:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 11:59

Символьные массивы
Ввести свою Фамилию, имя и Отчество, как одно текстовое поле. Определить длину...

Символьные массивы
Ребята, я по некоторих причинах пропустил пару по етой теме, и не знаю толком...

Символьные массивы
Написать и отладить программу для ввода предложения, содержащего несколько...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru