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

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

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

Найти самое длинное слово в строке - C++

20.11.2013, 18:18. Просмотров 3814. Ответов 13
Метки нет (Все метки)

В общем, нужно найти в строке самое длинное слово и вывести его, не создавая при этом новых строк. Всё находит, выводит, но после этого почему-то вылетает. Поняла только, что это происходит из-за части, где я уже записываю наверх найденное слово и пытаюсь стереть оставшуюся часть строки.

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
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
void main()
{
char *str;
int n=0;//4islo bukv v slove
int maxn=0;//nu da
 clrscr();
 cout<<"stroka: ";
  gets(str);
  cout<<endl;
 
//типа нахожу число букв в самом длинном слове
for(int i=0;i<strlen(str);i++) {
if((str[i]!=' '))
n++;
if((str[i]==' ')||(strlen(str)-i==1)){
if(n>maxn)
maxn=n;
n=0;        }                   }
n=0;
 
for(i=0;i<strlen(str);i++) {
if((str[i]!=' '))
n++;
if((str[i]==' ')||(strlen(str)-i==1)){        //типа нахожу само это слово и записываю его в начало всё той же строки
if(n==maxn){
    int k=i+1-maxn;
    for(int j=0;j<maxn;++j){
    str[j]=str[k];
    k++;            }
    break;
        }
 
n=0;                      }
                }
for(i=maxn;i<strlen(str);i++)       //типа как-то по-дурацки обнуляю оставшуюся часть
str[i]=0;
puts(str);
 getch();
}
ЗЫ: Знаю, что способ нерациональный, дурацкий и всё такое, но при выполнении вроде всё правильно - и вылет=(((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2013, 18:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти самое длинное слово в строке (C++):

Найти самое короткое и самое длинное слово в строке - C++
Введённый строке найти самое короткое и длинное слово.словом считается последовательность симболов,которое отделено пробелом или знаком...

Найти самое короткое и самое длинное слово в строке - C++
#include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; using namespace std; void inp(char); void...

Найти самое длинное и самое короткое слово в строке - C++
Вообщем, дано задание найти самое длинное и самое короткое слово в строке. Все хорошо работает, но, если мы зададим слова , отличающиеся...

Найти самое длинное слово в строке - C++
Здравствуйте! Нужно найти самое длинное слово в строке, введённой с клавиатуры. Желательно самый простой способ с коментариями....

Найти самое длинное слово в строке - C++
Найти в строке самое длинное слово и распечатать его

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

13
rrrFer
Заблокирован
20.11.2013, 18:38 #2
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
string str, longword, word;
stringstream sstr;
 
sstr << str;
sstr >> longword;
while (false == sstr.eof()) {
  sstr >> word;
  if (word.length() > longword.length())
    longword = word;
}
"не создавая новых строк" не заметил, щас исправлю )

C++ (Qt)
1
2
3
char *str;
// ...
  gets(str);
Почему оно работает вообще? память под строку не выделяется...

Добавлено через 11 минут
Если править ваш код, а не писать новый, то так как-то:
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
#include <stdio.h>
#include <iostream>
#include <string.h>
 
int main() {
  char *str = new char[255];
  int n=0, maxn=0, pos = 0, len;
  
  strcpy(str, "2134 235 23673 42 423 145 24 234 25");
  len = strlen(str);
 
  for(int i=0;i<len;i++) {
    if(str[i]!=' ')
      n++;
    if((str[i]==' ')||(len-i==1)) {
      if(n>maxn) {
        pos = i - n;
        maxn=n;
      }
      n=0;   
    }
  }                   
  
  for (int i = 0; i < maxn; ++i)
    std::cout << str[i + pos];
  std::cout << std::endl;
 
  delete []str;
}
Та, часть, кода, которая выполняла это: "//типа нахожу само это слово и записываю его в начало всё той же строки" вообще не нужна в задании.
1
Raton_Laveur
0 / 0 / 0
Регистрация: 19.07.2013
Сообщений: 16
21.11.2013, 14:47  [ТС] #3
Да, неплохо тупанула, спасибо) Насчёт того, почему работает - на Си, по-моему, вообще практически любой бред работает, просто делает это соответственно глупости писавшего код))

Добавлено через 22 минуты
Только что дошло, что по-человечески это всегда делалось через strtok, ржу

Добавлено через 10 минут
Хотя я нагло вру, там же новые строки создаются...
Единственное, что ещё стрёмно: в моём коде оно реагирует на пробелы, т.е. если в строке есть другие знаки препинания, то получается бред, ибо даже если их указать в условии, то всё равно они не учитываются при запоминании позиции...

Добавлено через 42 минуты
Всё решилось весьма топорно, но просто:
C++
1
2
3
4
5
6
7
8
9
for(int i=0;i<strlen(str);i++) {
if((str[i]!=' ')&&(str[i]!=',')&&(str[i]!='.')&&(str[i]!=';')&&(str[i]!=':'))
n++;
if((str[i]==' ')||(strlen(str)-i==1)||(str[i]==',')||(str[i]=='.')||(str[i]==';')||(str[i]==':')){
if(n>maxn){
maxn=n;
pos=i-n;
if(i>n) pos++;}
n=0;        }                   }
0
AGPro
4 / 4 / 0
Регистрация: 03.04.2016
Сообщений: 90
06.04.2016, 15:47 #4
Здесь проги с ошибками, к сожалению. Правильного решения нет.
0
flash_back
5 / 5 / 0
Регистрация: 07.02.2016
Сообщений: 65
Завершенные тесты: 1
16.06.2016, 16:05 #5
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 <cstring>
 
using namespace std;
 
int main()
{
 
    char string[200];
 
    cin.getline(string,200);
 
    char * pch = strtok (string," "),  // получаем первое слово
         * word = 0; // самое длинное слово
 
    int length = strlen(pch);          // определяем длинну первого слова
 
    int maxLen = 0; // самое длинное слово
 
      while (pch != NULL)                         // пока есть слова
      {
          length = strlen(pch);        // определяем длинну слова
 
          if (maxLen < length )        // определяем самое длинное слово
          {
              maxLen = length;
              word = pch;              // сохраняем указатель на текущее слово
          }
 
          pch = strtok (NULL, " "); // получаем следующее слово
      }
 
      cout << word;
 
 
    return 0;
}
0
Qitelery
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 32
14.07.2017, 21:30 #6
Здравствуйте! На всякий случай задание:
Найдите в данной строке самое длинное слово и выведите его.

Входные данные

Вводится одна строка. Слова в ней отделены одним пробелом.

Выходные данные

Выведите самое длинное слово. Если таких слов несколько, то выводить нужно, которое встречается раньше.

мой код:
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 <string>
#include <cstring>
using namespace std;
int main() {
    int k, l;
    string s, p, y;
    p = 0;
    getline(cin, s);
    for (auto c : s){// цикл, чтобы замерить первое слово и забить его в переменную y, определить его длину l
        if (c == ' '){
            l = strlen(p);
            y = p;
            p = 0;
            break;
        }
        p = p + c;
    }
    for (auto c : s){ // цикл шагаем до первого пробела, забивая символы в p, и при пробеле сравниваем счетчик k c l, т.е. длинну текущего слова с последним самым длинным.
        if (c == ' '){
            if (k > l){
                y = p;
                l = k;
                p = 0;
                k = 0;
            }else{
                p = 0;
                k = 0;
            }
        }else{
            p = p + c;
            k++;
        }
    }
    cout << y;
  return 0;
}
Думаю, что логика верна, но мне не хватает возможно синтаксической составляющей. К примеру, правильно ли я оперирую строками, когда набираю по буквам слова до пробела и когда делаю строку пустой. Пожалуйста помогите. Спасибо!
0
Геомеханик
623 / 430 / 310
Регистрация: 26.06.2015
Сообщений: 971
15.07.2017, 03:34 #7
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
#include <iostream>
#include <cstring>
 
char* max_word_len(char* s){
    const char delim[] = " \t\n,.!?";
    char*  p = NULL;
    size_t i, m = 0;
    while(*s){
        i  = strspn(s, delim);
        s += i;
        if(!*s)
            break;
 
        if((i = strcspn(s, delim)) > m){
            m = i;
            p = s;
        }
        s += i;
    }
 
    if(p != NULL)
        *(p + m) = '\0';
    return p;
}
 
int main(void){
    char s[] = "Apl, Algol, Fortran, Perl.";
 
    char* w = max_word_len(s);
    if(w != NULL)
        std::cout << w << std::endl;
    std::cin.get();
    return 0;
}
1
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,777
15.07.2017, 03:38 #8
Судя по стилю, нужен адский школьный "код", который к тому же должен в Borland TurboC++ компилироваться? Тогда вот:
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
#include <iostream.h>
#include <ctype.h>
 
int main() {
    const int MAX_STRING_LENGTH = 256;
    char str[MAX_STRING_LENGTH];
    
    while ( cout << "String: " && cin.getline(str, MAX_STRING_LENGTH) && *str ) {
        int inWord = 0;
        int longestWordStart = 0;
        int longestWordLength = 0;
        int currentWordStart;
        int currentWordLength;
        int i;
        
        for ( i = 0; ; ++i ) {
            if ( isspace(str[i]) || ispunct(str[i]) || str[i] == '\0' ) {
                if ( inWord ) {
                    if ( currentWordLength > longestWordLength ) {
                        longestWordStart = currentWordStart;
                        longestWordLength = currentWordLength;
                    }
                    inWord = 0;
                }
                if ( str[i] == '\0' )
                    break;
            }
            else {
                if ( ! inWord ) {
                    inWord = 1;
                    currentWordStart = i;
                    currentWordLength = 1;
                }
                else
                    currentWordLength += 1;
            }
        }
        
        cout << "Longest (" << longestWordLength << " characters) word: ";
        for ( i = longestWordStart; i < longestWordStart + longestWordLength; ++i )
            cout << str[i];
        
        cout << endl;
    }
    
    return 0;
}
Найти самое длинное слово в строке
1
Qitelery
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 32
18.07.2017, 19:57 #9
easybudda, Геомеханик, возможно выполнить данную задачу без применения char?

Код должен компилироваться в C++. Использую ideone.com
0
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,777
18.07.2017, 20:17 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <sstream>
 
int main() {
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ) {
        std::istringstream ist(str);
        std::string longest;
        
        ist >> longest;
        while ( ist >> str )
            if ( str.length() > longest.length() )
                longest = str;
        
        std::cout << "First longest word: " << longest << std::endl;
    }
    
    return 0;
}
Код
> g++ longest_word.cpp 
> ./a.out 
String: any many money more
First longest word: money
1
Qitelery
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 32
21.07.2017, 20:22 #11
easybudda, возвращаясь к char, использовать что-то типа
C++
1
2
char s[];
cin >> s[];
можно?

т.е. сделать так, чтобы не задавать изначально максимальные размер массива, потому что мало ли какого размера будет вводимый массив.
0
no swear
60 / 62 / 30
Регистрация: 01.07.2016
Сообщений: 489
Завершенные тесты: 1
21.07.2017, 20:49 #12
монжо так:
C++
1
2
char s[255];
cin.getline(s, 255);
Добавлено через 54 секунды
Окончание ввода это нажатие Enter
1
nd2
2327 / 1914 / 672
Регистрация: 29.01.2016
Сообщений: 6,247
21.07.2017, 22:59 #13
Цитата Сообщение от Qitelery Посмотреть сообщение
т.е. сделать так, чтобы не задавать изначально максимальные размер массива, потому что мало ли какого размера будет вводимый массив.
Для этого и существует std::string.
1
Qitelery
0 / 0 / 0
Регистрация: 17.05.2016
Сообщений: 32
22.07.2017, 18:41 #14
В общем ларчик открылся следующим образом))

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
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main() {
    int k, l;
    string s, p, y;
    p = ' ';
    getline(cin, s);
    s = s + p;
    for (auto c : s){
        if (c == ' '){
            l = p.size();            
            y = p;
            p = "";            
            break;
        }
        p = p + c;
    }
    for (auto c : s){
        if (c == ' '){
            if (k > l){             
                y = p;                
                l = k;
                p = "";
                k = 0;
            }else{
                p = "";
                k = 0;
            }
        }else{
            p = p + c;
            k++;          
        }
    }
    cout << y;
  return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2017, 18:41
Привет! Вот еще темы с ответами:

Найти самое длинное слово в строке - C++
помогите написать программу (с учетом условия выполнения) Написать программу, которая будет находить самое длинное слово в строке,...

Найти самое длинное слово в строке - C++
Я в правильном направлении иду? #include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include...

В строке символов найти самое длинное слово - C++
В строке символов найти самое длинное слово.Словом считается последовательность символов что отделяется от других символов определенным...

Найти в данной строке самое длинное слово - C++
Задача: Найдите в данной строке самое длинное слово и выведите его. Входные данные Вводится одна строка. Слова в ней отделены...


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
22.07.2017, 18:41
Ответ Создать тему
Опции темы

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