Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2010, 17:05   #1
LOST94
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 47
По умолчанию как же все таки сравнить содержимое двух строк?

#include <iostream>
#include <cstring>
using namespace std;
int main() {
while(true) {
unsigned char x[3]="12";
unsigned char y[3]="12";
if(strcmp(x,y)) cout <<x[1];

cin.get();
}
}
.
.
.
ошибку выдает вот такую:
invalid conversion from `unsigned char*' to `const char*'
LOST94 вне форума Ответить с цитированием
Старый 22.03.2010, 17:14   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

потому что передаешь ты unsigned char, а требуется обычный char (на квалификатор конст на данном этапе можно положить)
и кстати, если строки равны, strcmp вернет 0. это так, на всякий случай
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 22.03.2010 в 17:19.
pproger вне форума Ответить с цитированием
Старый 22.03.2010, 17:46   #3
LOST94
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 47
По умолчанию

мне надо русские буквы сравнивать) а они только в беззнаковом
LOST94 вне форума Ответить с цитированием
Старый 22.03.2010, 17:58   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

с какова перепуга.

Код:
	char str1[] = "превед";
	char str2[] = "превед";

	if (!strcmp(str1, str2))
		printf("equal\n");
	else
		printf("not equal\n");
char и unsigned char отличаются только представлением данных. будешь интерпретировать как тип данных со знаком - старший бит будет являться флагом знака, не будешь - все биты пойдут под данные.

а вообще по-хорошему нужно сравнивать в зависимости от кодировки, в которой находится сорс.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 22.03.2010, 18:05   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Можно так:

Код:
#include <iostream.h>
#include <string.h>


int main()
{
	char a[5], b[5];

	memset(a, 0, 5);
	memset(b, 0, 5);

	memcpy(a, "брр", 5);
	memcpy(b, "брр", 5);

	if(memcmp(a, b, 5) == 0)
		cout << a << " = " << b << "\n";

	if(memcmp(a, b, 5) > 0)
		cout << a << " > " << b << "\n";

	if(memcmp(a, b, 5) < 0)
		cout << a << " < " << b << "\n";

	return 0;
}

Последний раз редактировалось profi; 22.03.2010 в 18:08.
profi вне форума Ответить с цитированием
Старый 22.03.2010, 18:32   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2profi
так нельзя делать ни в коем случае. мало того, что сравниваются лишние байты (когда требуется только первые 3, к примеру. strcmp сравнивает до завершающего нуля), к тому же это потенциально опасно. про тройное сравнение вообще молчу
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 22.03.2010, 19:07   #7
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
так нельзя делать ни в коем случае.
Не сильно понял почему.

Цитата:
что сравниваются лишние байты
Так в чем проблема написать:
Код:
 memcmp(a, b, strlen(a));
Цитата:
про тройное сравнение вообще молчу
Это?

Код:
	if(memcmp(a, b, 5) == 0)
		cout << a << " = " << b << "\n";

	if(memcmp(a, b, 5) > 0)
		cout << a << " > " << b << "\n";

	if(memcmp(a, b, 5) < 0)
		cout << a << " < " << b << "\n";
А что тут плохого?

Последний раз редактировалось profi; 22.03.2010 в 19:58.
profi вне форума Ответить с цитированием
Старый 23.03.2010, 14:52   #8
skrudjmagdak
Пользователь
 
Регистрация: 02.12.2009
Сообщений: 33
По умолчанию

А нельзя просто написать: if (x[3]>y[3]) {...} else {..} или if (x[3]<=y[3]) {...} else {..}???
skrudjmagdak вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебрать и сравнить ячейки двух столбцов! ddv1 Microsoft Office Excel 17 09.10.2014 07:54
Бакалавриат - хорошо или все-таки плохо? Mr.Qwerty Свободное общение 33 17.08.2011 06:08
Как всё-таки загрузить image из memorystream? TwiX Общие вопросы Delphi 12 27.09.2009 21:09
скопировать все содержимое папки в другую DannyKing Помощь студентам 6 27.03.2009 09:50