Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PadawanC
1 / 1 / 0
Регистрация: 22.07.2013
Сообщений: 25
#1

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

22.07.2013, 21:58. Просмотров 953. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сравнение строк (символьные массивы), игнорируя регистровые различия (C++):

Символьные массивы. Сравнение с алфавитом - C++
вечер добрый. задача такая: имеется символьный массив алфавитный(32 кириллица) и символьный массив (размер около 5-10) который...

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

Функция getline считывает несколько строк из файла, игнорируя символ новой строки - C++
Всем доброго дня! В С++ я новичок, сам себе придумываю задачки, просто для тренировки. Столкнулся с непонятным для меня поведением...

Символьные массивы - C++
Написать и отладить программу для ввода предложения, содержащего несколько круглых скобок. Если число открывающихся скобок равно числу...

Символьные массивы - C++
Ввести свою Фамилию, имя и Отчество, как одно текстовое поле. Определить длину и количество букв &quot;а&quot; в нем. Решить задачу одним из...

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

9
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 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
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.07.2013, 08:14 #5
Цитата Сообщение от PadawanC Посмотреть сообщение
Все, понял,.... Исправил, все заработала.
так регистровые различия не будут игнорироваться, так что задачу еще не решили. При таком раскладе ваша программа определит, что "AA" < "aa", но должно быть "AA" == "aa"
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.07.2013, 11:14 #6
Thinker, А код ПЕРЕД strcmp посмотреть?
1
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.07.2013, 11:59 #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Thinker, А код ПЕРЕД strcmp посмотреть?

Не по теме:

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

0
h_wolf
9 / 9 / 1
Регистрация: 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 / 1
Регистрация: 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
Привет! Вот еще темы с ответами:

Двумерные массивы (+символьные) - C++
Вот 5 задач... необходимо помочь братишке... сам я в С++ не особо силен... Сильно прошу вас помочь мне... За оказанную услугу готов...

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

Регистровые переменные - C++
Если некоторая переменная целого типа объявляется со спецификатором register, то это (насколько я понял, кстати правильно это или нет?)...

Строковые переменные (символьные массивы) - C++
Создать две строковые переменные (символьные массивы), содержащие ваше имя и фамилию. Выполнить с ними с помощью строковых функций...


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

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

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