Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/36: Рейтинг темы: голосов - 36, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
1

[Visual C++]strcmp()

12.01.2010, 20:14. Показов 7394. Ответов 11
Метки нет (Все метки)

Нужно слова, которые считываются в буфер 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]); 
}
 
 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2010, 20:14
Ответы с готовыми решениями:

strcmp
Вот изучаю С++, тут столкнулся с простой проблеммой, функция strcmp,которая проверяет на равенство...

strcmp()
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cstring&gt; using namespace...

STRCMP
Как работает функция strcmp? strncmp? while(L&lt;R) { ...

strcmp
slovo={'d','d','d'}; char *slovo2=new char; for(int i=0;i&lt;k;i++) { cin&gt;&gt;slovo2; } int...

11
Эксперт С++
7175 / 3234 / 79
Регистрация: 17.06.2009
Сообщений: 14,164
12.01.2010, 22:23 2
if (strcmp( &stroka[j], &stroka[min] )
Зачем адреса сравнивать - нужно сами строки сранивать.
C++
1
if  (strcmp( stroka[j], stroka[min] )
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
12.01.2010, 23:13  [ТС] 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];
видимо в этом ошибка есть тоже.
0
2810 / 1401 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
12.01.2010, 23:21 4
Цитата Сообщение от atomlex Посмотреть сообщение
cannot convert parameter 1 from 'char' to 'const char *'
ты видишь разницу между указателем на символ (фактически, строкой) и символом?
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
12.01.2010, 23:56  [ТС] 5
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
ты видишь разницу между указателем на символ (фактически, строкой) и символом?
Указатель на символ содержит его адрес, а символ это символ.Так ведь?

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

Добавлено через 24 минуты
начинаю понимать.
в strcmp() должны быть указатели на константу, в данном случае на элемент строки, а у меня сравнивается просто массив.
но как нормально сравнение сделать тогда?
0
Автор FAQ
3684 / 961 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.01.2010, 00:25 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;
}
2
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
13.01.2010, 00:38  [ТС] 7
ох спасибо.
хорошее обьяснение)
если условие у меня такое
C++
1
if  (strcmp( &stroka[j],  &stroka[min] )>0)
то он посимвольно читает, и в конце концов программа вылетает с ошибкой.
я хочу понять, как сделать если у меня в массиве stroka хранится определенная строка, типа"разработать программу которая читает текстовый файл", и чтобы это дело отсортировалось по алфавиту, получается надо, чтобы в &stroka[j] было "разработать", в &stroka[min] "программу" и шло сравнение этих слов, и остальных в строке.
0
Эксперт С++
7175 / 3234 / 79
Регистрация: 17.06.2009
Сообщений: 14,164
13.01.2010, 09:00 8
char stroka[1000000];
Ну да - в этом коде этого определения как раз не хватало.
Я думал что сделано так:
char **stroka;
0
3083 / 2404 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
13.01.2010, 10:25 9
Цитата Сообщение от atomlex Посмотреть сообщение
я хочу понять, как сделать если у меня в массиве stroka хранится определенная строка, типа"разработать программу которая читает текстовый файл", и чтобы это дело отсортировалось по алфавиту, получается надо, чтобы в &stroka[j] было "разработать", в &stroka[min] "программу" и шло сравнение этих слов, и остальных в строке.
Думается, что сдесь надо завести массив строк, разбить stroka'у на отдельные слова функцией strtok, записать их в массив, отсортировать, и из отсортированного массива загнать обратно в strоka'у.
0
Автор FAQ
3684 / 961 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
13.01.2010, 23:18 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;
   }
}
Поясняю: мы просматриваем строку столько раз сколько у нас букв в алфавите (массиве) и каждый раз ищем именно ту букву которая щас по упорядочиванию идет (от А до Я). Если слово начинается с этой буквы - печатаем, если нет пропускаем и ищем дальше... вместо печати можно создать новую строку да и туда добавлять, правда это сложнее все таки)
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
14.01.2010, 19:33  [ТС] 11
Спасибо за советы, ребят)
0
1 / 1 / 0
Регистрация: 27.11.2009
Сообщений: 30
16.01.2010, 12:33  [ТС] 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 мне не подходит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2010, 12:33

Strcmp
Пользуюсь Visual Studio 2013. Читай книжку, выполняю примеры. Там есть пример с использованием...

strcmp
Не могу понять, как правильно прировнять два слова. КОгда компилирую и ввожу слово, програма...

функция strcmp
какое бы не было nazv_otdela всегда пишет равны как лечить? void predpri9tie::zad() {...

Strcmp и пробелы
Здравствуйте. Необходимо реализовать проверку пароля. Пароль должен быть с пробелами, как я поняла...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru