Zeeking99 Ответов: 4

Печать самого длинного слова и его длины из строки.


Я сделал программу, которая должна сканировать строку, находить самое длинное слово строки и печатать его длину и слово. Но по какой-то причине он не работает должным образом. Он показывает странные символы.

Чтобы найти его, программа начинает сканирование строки с помощью цикла for. Затем в первом цикле for есть еще один цикл for, который находит длину слова. Если длина больше текущего самого длинного слова, оно присваивает это слово другой строке.

#include<stdio.h>

int main()
{
	char string1[] = "This program finds the longest word", longestword[20];
	int index,letters,longestnumber=0,temp=0,j;
	
	for(index=0;string1[index]!='\0';index++)
	{
		temp = index;
		
		for(letters=0;string1[index]!=' ' && string1[index]!='\0' ;index++,letters++);
		
		j=0;
		
		if(letters>=longestnumber)
		{
			while(string1[temp] != ' ')
			{
				longestword[j] == string1[temp];
				temp++;
				j++;
			}
		}
	}
	
	printf("%d %s",longestnumber,longestword);
	
	return 0;
}


Что я уже пробовал:

Я думал, что это будет бесконечная петля, но это не так. Вместо этого он заканчивается странными символами.

4 Ответов

Рейтинг:
2

Richard MacCutchan

Вы не копируете символы в longestword, правильный оператор присваивания-это один = знак. Вам также нужно добавить нулевой символ ('\0') в конце longestword следующим образом:

while(string1[temp] != ' ')
    {
        longestword[j] = string1[temp]; // single = sign for assignment
        temp++;
        j++;
    }
    longestword[j] = '\0'; // add terminating null
    longestnumber = letters; // save the value of longest word here
}
if (string1[index] == '\0')
    break;


Zeeking99

Я совершила такую глупую ошибку. Спасибо, что рассказал.

Zeeking99

Я добавил нулевой символ в конце, но это то же самое.

Richard MacCutchan

Смотрите мое обновленное решение.
Вам нужно сохранять значение самого длинного числа каждый раз, когда вы его считаете (в противном случае оно остается равным нулю)
Вам также необходимо выйти из основного цикла, если индекс строки указывает на завершающий нулевой символ.

Zeeking99

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

Рейтинг:
0

KarstenK

Ваш внутренний цикл for

for(letters=0;string1[index]!=' ' && string1[index]!='\0' ;index++,letters++);
не имеет тела и бегает всегда от нуля.
Я думаю, что он должен работать от индекса. Longestnumber не задан, и вы должны завершить самое длинное слово нулем.

Вы можете использовать функцию C strtok для разбиения строки и использования подстрок.

Ваш код работает не так, как вы ожидаете. А как насчет использования отладчика?


Zeeking99

Я попробовал использовать отладчик, но окно выскакивает и исчезает за долю секунды.

Рейтинг:
0

Gerry Schmitz

Преобразуйте его в "управляемый" C# (или C++ ?) и используйте "строку.Функция Split позволяет создать массив "слов" из вашей строки.

Тогда у вас есть несколько способов найти самое длинное слово.

Но сначала вы должны прийти к свету; из тьмы, которая "неуправляема".


Zeeking99

Это задание, и я должен написать код на самом языке Си.

Gerry Schmitz

Вам не нужны 2 петли "для".

Сканируйте строку как массив символов.

Начните подсчитывать каждую последовательность непустых символов; сбрасывайте с каждым пробелом.

Отследите "самый высокий счет" (начальный индекс и длину).

Крайний случай: 2+ слова с одинаковой "самой большой" длиной.

Рейтинг:
0

Patrice T

Цитата:
Вместо этого он заканчивается странными символами.

это потому что longestword не содержит нулевой завершающей строки.
Вы забыли поставить "\0 " в конце слова.
-----
Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.