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

[Visual C++]strcmp() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 53, средняя оценка - 4.66
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
12.01.2010, 20:14     [Visual C++]strcmp() #1
Нужно слова, которые считываются в буфер stroka, отсортировать по алфавиту с пом. strcmp.
Ошибка в том, что в условии
C++
1
if  (strcmp( &stroka[j], &stroka[min] )>0)
в массивах stroka[j], stroka[min] - хранится весь массив строк, а не отдельные его слова.Думаю, что ошибка в циклах.
visual c++ 6.0 mfc appwizzard.
Код прилагается:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
void CProjectDlg::OnReadF() 
 
  {
 
char Filter []= "TextFile (*.txt),(*.doc) | *.txt; *.doc | All (*.*) | *.*||";
CFileDialog fd(TRUE,(LPCSTR) ".txt", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,(LPCSTR) Filter);
if(fd.DoModal()==IDOK)   
{
    CString s; CString stroka("");
    s = fd.GetFileName();
    char cc[256000];
    ifstream f(s);
    
    CEdit* a;
    a=(CEdit*)GetDlgItem(IDC_EDIT1);
    
    for (;!f.eof();)
    {
    f>>cc;
    stroka=stroka+cc+" ";
    };
    a->SetWindowText(stroka); 
    
}   
 
}
 
//----------------------------------------------------------------------------------------------
void CProjectDlg::OnSort() 
{
    UpdateData(1);
    CEdit* a = (CEdit*)GetDlgItem(IDC_EDIT1);
//char b[256];
 
    a->GetWindowText(stroka,255);
 
    char k;
 
 
//проверка наличия данных для сортировки
if (stroka == NULL) 
{
    MessageBox("Сортировать нечего.", "Информация", MB_ICONINFORMATION);
  return; 
}
 
 
// сортировка методом выбора
int IntNum;
 
int min ;
 
for (int i=0; i<IntNum-1; i++)
{
    min = i;
int j;
 for (j=i+1; j<IntNum; j++)
 {
     if  (strcmp( &stroka[j], &stroka[min] )>0){
min=j;
     }
     k = stroka[min];
      stroka[min] = stroka[i];
      stroka[i] = k;
  }
}
 
//выводим отсортированные данные в эдит бокс m_sec
for (i=0; i<IntNum; i++)
{
    m_sec.Format(stroka[i]); 
}
 
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2010, 20:14     [Visual C++]strcmp()
Посмотрите здесь:

strcmp C++
C++ strcmp()
Баг strcmp C++
C++ strcmp не работает!
C++ STRCMP
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
12.01.2010, 22:23     [Visual C++]strcmp() #2
if (strcmp( &stroka[j], &stroka[min] )
Зачем адреса сравнивать - нужно сами строки сранивать.
C++
1
if  (strcmp( stroka[j], stroka[min] )
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
12.01.2010, 23:13  [ТС]     [Visual C++]strcmp() #3
Цитата Сообщение от odip Посмотреть сообщение
Зачем адреса сравнивать - нужно сами строки сранивать.
C++
1
if  (strcmp( stroka[j], stroka[min] )
Дело в том, что если убрать адреса, то получается ошибка
C++
1
error C2664: 'strcmp' : cannot convert parameter 1 from 'char' to 'const char *'
Сам буфер stroka задан следующим образом:

C++
1
char stroka[1000000];
видимо в этом ошибка есть тоже.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.01.2010, 23:21     [Visual C++]strcmp() #4
Цитата Сообщение от atomlex Посмотреть сообщение
cannot convert parameter 1 from 'char' to 'const char *'
ты видишь разницу между указателем на символ (фактически, строкой) и символом?
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
12.01.2010, 23:56  [ТС]     [Visual C++]strcmp() #5
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
ты видишь разницу между указателем на символ (фактически, строкой) и символом?
Указатель на символ содержит его адрес, а символ это символ.Так ведь?

Видимо нужно ввести еще один маасив указателей, например:
C++
1
2
const char *p;
&p = stroka;
Или я не правильно мыслю?

Добавлено через 24 минуты
начинаю понимать.
в strcmp() должны быть указатели на константу, в данном случае на элемент строки, а у меня сравнивается просто массив.
но как нормально сравнение сделать тогда?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
13.01.2010, 00:25     [Visual C++]strcmp() #6
О да, это все может поначалу серьёзно запутывать. Не давай человеку рыбу, научи рыбачить... ага....
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char char_array[30] = "Какая то строка. Ещё строка"; // массив символов ещё не строка а лишь массив символов
char* str = &char_array[0]; // адрес на какой либо элемент символов ознаменует появление новой строки, причем строка начнется с указанного символа
char* half_str = &char_array[17]; // т.е. можно так и строка будет меньше
// Присвоение строке вызовет присвоение адресу его первого символа
str = "Привет война! :)"; // причем это ссылка на const char
// Попробуем изменить символ строки. То что указано в [] означает на сколько символов мы сместиися
// Это объясняется что каждый последующий адрес отвечает за последующий символ (а обращаясь к адресу
// мы можем обратиться к переменной символьного типа
//str[7] = 'м'; // будет ошибка - попытка изменения const char
char new_char_array[17] = "Привет война! :)"; // это строка уже не const и её можно изменить
str = &new_char_array[0]; // ссылаемся на неё
str[7] = 'м'; // ошибок нет, попробуем дальше
str[8] = 'и';
str[9] = 'р';
str[10] = '!';
// Посмотрим что же в str
str;
// ой! не забываем что строка должна завершаться нулем (NULL)
str[11] = NULL; // обрезали все что после 10 символа шло (т.к. 11 уже пустота)
// Теперь содержание str - порядок!
// HINT: "Привет мир!"

Не по теме:

Я раньше с этими строками клавиатуру зубами грыз, но ничего, понятное дело с Lua переходить где все удобства и никаких тебе адресов)


C++
1
2
3
4
strcmp(&char_array[0], "Какая то строка. Ещё строка"); // сравнение строки полученной из массива с константной строкой (она автоматически преобразуется в указатель для правильной передачи)
strcmp(&char_array[17], "Ещё строка"); // сравниваем начиная с определенного символа в массиве
strcmp("Тест", "Тест"); // хм, так тоже можно, но зачем?
strcmp("Тест", str); // вторым параметром посылаем ссылку на символ
Если сравниваемые величины в одном массиве то их можно сравнить, главное чтобы они разделялись нулевым символом (NULL)
C++
1
2
strcmp(&char_array[0], &char_array[17]);// внимание! в данном случае символ NULL должен находиться в 16 позиции (или ранее)
// так же необходимо помнить что строка начинающаяся на 17 символе (второй параметр) тоже должна заканчиваться NULL
Если символы разделены пробелом то можно легко заменить их на символы NULL для сравнивания. Например так
C++
1
2
3
4
5
for (int i = 0; i < array_size; i++)
{
   if ( char_array[i] == ' ' )
      char_array[i] = NULL;
}
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
13.01.2010, 00:38  [ТС]     [Visual C++]strcmp() #7
ох спасибо.
хорошее обьяснение)
если условие у меня такое
C++
1
if  (strcmp( &stroka[j],  &stroka[min] )>0)
то он посимвольно читает, и в конце концов программа вылетает с ошибкой.
я хочу понять, как сделать если у меня в массиве stroka хранится определенная строка, типа"разработать программу которая читает текстовый файл", и чтобы это дело отсортировалось по алфавиту, получается надо, чтобы в &stroka[j] было "разработать", в &stroka[min] "программу" и шло сравнение этих слов, и остальных в строке.
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
13.01.2010, 09:00     [Visual C++]strcmp() #8
char stroka[1000000];
Ну да - в этом коде этого определения как раз не хватало.
Я думал что сделано так:
char **stroka;
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.01.2010, 10:25     [Visual C++]strcmp() #9
Цитата Сообщение от atomlex Посмотреть сообщение
я хочу понять, как сделать если у меня в массиве stroka хранится определенная строка, типа"разработать программу которая читает текстовый файл", и чтобы это дело отсортировалось по алфавиту, получается надо, чтобы в &stroka[j] было "разработать", в &stroka[min] "программу" и шло сравнение этих слов, и остальных в строке.
Думается, что сдесь надо завести массив строк, разбить stroka'у на отдельные слова функцией strtok, записать их в массив, отсортировать, и из отсортированного массива загнать обратно в strоka'у.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
13.01.2010, 23:18     [Visual C++]strcmp() #10
Цитата Сообщение от atomlex Посмотреть сообщение
ох спасибо.
хорошее обьяснение)
если условие у меня такое
C++
1
if  (strcmp( &stroka[j],  &stroka[min] )>0)
то он посимвольно читает, и в конце концов программа вылетает с ошибкой.
я хочу понять, как сделать если у меня в массиве stroka хранится определенная строка, типа"разработать программу которая читает текстовый файл", и чтобы это дело отсортировалось по алфавиту, получается надо, чтобы в &stroka[j] было "разработать", в &stroka[min] "программу" и шло сравнение этих слов, и остальных в строке.
Сортировка по первой букве? Тогда пожалуй можно так... завести массив символов вроде
C++
1
const char Az[кол_во_букв] = {'А', 'а', 'Б', 'б', ... и так далее до 'я'};
Потом такой трюк.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i< кол_во_букв; i++)
{
   for (int j = 0; j < размер_stroka; j++)
   {
       if ( bNewWord == true )
          if ( stroka[j] == Az[i] ) // текущее слово должно быть распечатано сейчас
          {// печатаем, забыл как там =)
              bNewWord = false;
          }
       if ( stroka[j] == ' ' ) // если текущий символ - пробел, значит дальше идет слово
           bNewWord = true;
   }
}
Поясняю: мы просматриваем строку столько раз сколько у нас букв в алфавите (массиве) и каждый раз ищем именно ту букву которая щас по упорядочиванию идет (от А до Я). Если слово начинается с этой буквы - печатаем, если нет пропускаем и ищем дальше... вместо печати можно создать новую строку да и туда добавлять, правда это сложнее все таки)
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
14.01.2010, 19:33  [ТС]     [Visual C++]strcmp() #11
Спасибо за советы, ребят)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2010, 12:33     [Visual C++]strcmp()
Еще ссылки по теме:

strcmp C++
C++ strcmp
Strcmp C++

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

Или воспользуйтесь поиском по форуму:
atomlex
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
16.01.2010, 12:33  [ТС]     [Visual C++]strcmp() #12
Появился вопрос.
C++
1
2
3
4
5
6
7
8
for (int z = 0; z < pin; z++) //pin - количество символов в строке
 
{
 
if (stroka[z] == ' ' )
    stroka[z] = '\0';
 
}
При завершении цикла, в stroka записывается только первое слово.Как это исправить?
Еще не могу придумать как в цикле подсчитать количество пробелов, чтобы узнать количество слов и использовать его как счетчик в сортировке.
Мне нужно сделать сортировку по алфавиту методом выбора, поэтому метод, предложенный
insideone мне не подходит.
Yandex
Объявления
16.01.2010, 12:33     [Visual C++]strcmp()
Ответ Создать тему
Опции темы

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