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

Сравнить строки и по количеству символов, и по коду - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.94
Noname2512
4 / 4 / 1
Регистрация: 25.06.2010
Сообщений: 106
09.08.2011, 15:39     Сравнить строки и по количеству символов, и по коду #1
народ какая функция строки сравнивает, и по количеству символов, и по коду
strcmp - как-то плохо сравнивает у меня строка "9" больше строки "333"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
09.08.2011, 15:41     Сравнить строки и по количеству символов, и по коду #2
Цитата Сообщение от Noname2512 Посмотреть сообщение
народ какая функция строки сравнивает, и по количеству символов, и по коду
strcmp - как-то плохо сравнивает у меня строка "9" больше строки "333"
На самом деле strcmp правильно сравнивает в лексикографическом порядке, так как '9' больше '3'. Вы лучше определитесь, по какому принципу вы хотите сравнивать строки. По крайней мере вы сами перед вызовом strcmp можете сравнить длины строк.
LosAngeles
Заблокирован
09.08.2011, 15:44     Сравнить строки и по количеству символов, и по коду #3
strlen wcslen
Noname2512
4 / 4 / 1
Регистрация: 25.06.2010
Сообщений: 106
09.08.2011, 16:02  [ТС]     Сравнить строки и по количеству символов, и по коду #4
Цитата Сообщение от Сыроежка Посмотреть сообщение
По крайней мере вы сами перед вызовом strcmp можете сравнить длины строк.
я так и сделал, хотелось просто все одной функцией , а то возникает
много всяких ветвлениий
Сыроежка
Заблокирован
09.08.2011, 16:10     Сравнить строки и по количеству символов, и по коду #5
Цитата Сообщение от Noname2512 Посмотреть сообщение
я так и сделал, хотелось просто все одной функцией , а то возникает
много всяких ветвлениий
Я бы не сказал, что уж очень много ветвлений. Если я правильно понял вашу задачу, то, например, можно было бы так реализовать функцию

C++
1
2
3
4
5
6
7
8
int StrCompare( const char *s1, const char *s2 )
{
   int result = strlen( s1 ) - strlen( s2 );
 
   if ( result == 0 ) result =  strcmp( s1, s2 );
 
   return ( result );
}
-=ЮрА=-
Заблокирован
Автор FAQ
09.08.2011, 16:13     Сравнить строки и по количеству символов, и по коду #6
Тогда нужно сочетание strlen и strcmp
Например так

C++
1
2
3
4
5
if(strlen(s1)==strlen(s2))//проверка на одинаковость длин строк
if(strcmp(s1,s2) == 0)
{
    //строки идентичны
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 17:26     Сравнить строки и по количеству символов, и по коду #7
Т.е. если в строках записаны 2 числа, то должно определятся наименьшее?
C++
1
2
3
4
5
6
7
8
9
10
11
12
int cmp(const char *a, const char * b){
    if (strlen(a) > strlen(b)) return 1;
    if (strlen(a) < strlen(b)) return -1;
    for (int i = 0; a[i]; ++i)
    {
        if (a[i] > b[i])
            return 1;
        if (a[i] < b[i])
            return -1;
    }
    return 0;
}
Сыроежка
Заблокирован
09.08.2011, 18:19     Сравнить строки и по количеству символов, и по коду #8
Цитата Сообщение от diagon Посмотреть сообщение
Т.е. если в строках записаны 2 числа, то должно определятся наименьшее?
C++
1
2
3
4
5
6
7
8
9
10
11
12
int cmp(const char *a, const char * b){
    if (strlen(a) > strlen(b)) return 1;
    if (strlen(a) < strlen(b)) return -1;
    for (int i = 0; a[i]; ++i)
    {
        if (a[i] > b[i])
            return 1;
        if (a[i] < b[i])
            return -1;
    }
    return 0;
}
А цифры, между прочим, также располагаются в лексиграфическом порядке. Так что если речь идет о строках равной длины, в которых содержатся числа без знаков, то ваш алгоритм не имеет смысла. А если к тому же там записаны числа со знаками, или действительные числа, то ваш алгоритм вообще не работает.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 18:24     Сравнить строки и по количеству символов, и по коду #9
Цитата Сообщение от Сыроежка Посмотреть сообщение
Так что если речь идет о строках равной длины, в которых содержатся числа без знаков, то ваш алгоритм не имеет смысла.
Это почему?
Вы же сами написали

Цитата Сообщение от Сыроежка Посмотреть сообщение
А цифры, между прочим, также располагаются в лексиграфическом порядке.
Допустим 2 строки
122 и 123
3 символ в них различается, в первой строке он меньше, поэтому функция вернет -1.
Цитата Сообщение от Сыроежка Посмотреть сообщение
А если к тому же там записаны числа со знаками
Да ну?
Согласно ASCII минус имеет код 45, а цифры начинаются с кода 48.
Если одно из чисел имеет минус, то оно однозначно меньше другого, т.к. первый символ меньше. Разве что с длиной строк проблема будет. Но все-таки функция должна сравнивать строки, а не числа =)

Цитата Сообщение от Сыроежка Посмотреть сообщение
действительные числа
Опять же, функция сравнивает строки, а не числа, но могу найти у себя работающую функцию, сравнивающую 2 вещественных числа.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.08.2011, 20:27     Сравнить строки и по количеству символов, и по коду #10
Что мешает написать функцию сравнения строк с числами не лексиграфически, а в натуральном виде?
По запросу "естественная сортировка" или "natural sort" можешь готовый предикат найти.
Даня98
 Аватар для Даня98
27 / 27 / 8
Регистрация: 13.02.2010
Сообщений: 145
09.08.2011, 23:53     Сравнить строки и по количеству символов, и по коду #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <fstream>
#include <string>
#include <algorithm>
int main()
{
    std:: string all,s="\0",s1="\0",s2="\0";
    int i=0;
    std:: ifstream ifs ("input.txt");
    ifs >> s >> s1 >> s2;
    int m = std:: max (s.size(), std:: max (s1.size(),s2.size()));
    while (s.size()<m) s.insert (0,"0");
    while (s1.size()<m) s1.insert (0,"0");
    while (s2.size()<m) s2.insert (0,"0");
    ifs.close();
    std:: ofstream ofs ("output.txt");
    ofs << std:: max(s,std::max(s1,s2));
    ofs.close();
    return 0;
}
Сравнение трех чисел я писал так. Сначала выбирается длина самой длинной строки, а затем все остальные строки приравниваются длинной к самой длинной добавлением нуля в начало.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,212
Завершенные тесты: 3
17.04.2015, 14:28     Сравнить строки и по количеству символов, и по коду #12
Мне вот че интересно, можно ли сравнивать строки с помощью ==? Или сравниваться будут лишь указатели на первый символ?

Добавлено через 31 минуту
Запутался че-то, по указателям-то ведь можно сравнить строки. Но почему нельзя пользоваться ==?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2015, 14:36     Сравнить строки и по количеству символов, и по коду
Еще ссылки по теме:

Определить номера символов в строках и сравнить их C++
Расположить слова в порядке возрастания по количеству символов C++
C++ Получить из строк новую строку, содержащюю первые N1 символов строки S1 и последнии N2 символов строки S2

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

Или воспользуйтесь поиском по форуму:
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
17.04.2015, 14:36     Сравнить строки и по количеству символов, и по коду #13
Цитата Сообщение от tnk500 Посмотреть сообщение
можно ли сравнивать строки с помощью ==?
Для std::string можно, у них есть перегруженные операторы для сравнения char* и string. При сравнении двух указателей на char будут сравниваться именно указатели, а не содержимое строк.
Yandex
Объявления
17.04.2015, 14:36     Сравнить строки и по количеству символов, и по коду
Ответ Создать тему
Опции темы

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