Member 13528039 Ответов: 3

Программа должна вернуть слово с наибольшим количеством букв.


#define _CRT_SECURE_NO_WARNINGS  
#include "stdio.h"  
#include "conio.h"  
#include "string.h"  

int CountofSym(char* szStr) //function that calculate the count of the word  
{
	int iCount = 0;  
	while (szStr[iCount] != '\0')  
	{  
		iCount++;  
	}  
	return iCount;  
}  

char MaxString(char* szStr) //that have to return the largest word  
{
	char* pch;  
	char* szNewString[100];  
	char* szMaxWord[1];  
	int iMax, iCurrent;  
	pch = strtok(szStr, " ,.");  
  
	int i = 0;  
	while (pch != '\0')  
	{  
		szNewString[i] = pch;  
		pch = strtok(NULL, " ,.");  
		i++;  
	}  
	iMax = CountofSym(szNewString[0]);  
	*szMaxWord = szNewString[0];  
	for (int j = 1; j < i; j++)  
	{  
		iCurrent = CountofSym(szNewString[j]);  
		if (iMax < iCurrent)  
		{	  
			iMax = iCurrent;  
			*szMaxWord = szNewString[j];  
		}  
	}  
	return *szMaxWord;  
}  
  
int main()  
{  
	char szString[100];  
	gets(szString);  
	char szMaximum[1];  
	szMaximum[0] = MaxString(szString);  
	printf("\n%s ", *szMaximum);  
  
	_getch();  
	return 0;  
}


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

Программа должна вернуть слово с наибольшим количеством букв. Ошибка может быть в точке возврата или в указателях. Может быть, он возвращает адрес значения. Я сделал несколько фотографий. Смотреть на них.
Папка - Google Диск[^]

Richard MacCutchan

MaxString должен возвращать указатель, а не символ.

Member 13528039

В этой строке: return *szMaxWord; ??

Richard MacCutchan

В объявлении функции:
char* MaxString(char* szStr)
Кроме того, какой смысл создавать массивы только для одного элемента?

Member 13528039

Спасибо.
Я не знаю. Я догадался, что массив помог мне понять

3 Ответов

Рейтинг:
5

Member 13528039


//the right code
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "conio.h"
#include "string.h"

int CountofSym(char* szStr)
{
	int iCount = 0;
	while (szStr[iCount] != '\0')
	{
		iCount++;
	}
	return iCount;
}

char* MaxString(char* szStr)
{
	char* pch;
	char* szNewString[100];
	char* szMaxWord[1];
	int iMax, iCurrent;
	pch = strtok(szStr, " ,.");

	int i = 0;
	while (pch != '\0')
	{
		szNewString[i] = pch;
		pch = strtok(NULL, " ,.");
		i++;
	}
	iMax = CountofSym(szNewString[0]);
	*szMaxWord = szNewString[0];
	for (int j = 1; j < i; j++)
	{
		iCurrent = CountofSym(szNewString[j]);
		if (iMax < iCurrent)
		{	
			iMax = iCurrent;
			*szMaxWord = szNewString[j];
		}
	}
	return *szMaxWord;
}

int main()
{
	char szString[100];
	gets(szString);
	printf("\n%s ", MaxString(szString));

	_getch();
	return 0;
}


Рейтинг:
2

Patrice T

Цитата:
Ошибка может быть в точке возврата или в указателях. Может быть, он возвращает адрес значения.

"может быть" - это жизнеспособный метод программирования!
Используйте отладчик, чтобы убедиться, что работает, а что нет.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.

Модульное тестирование также является хорошей идеей.
Модульное тестирование - Википедия[^]


Member 13528039

Я знаю об отладчике.
Я сделал несколько фотографий. Смотреть на них. https://drive.google.com/open?id=1VmxPNrjDK_vOWgaXTlngECW0q8P_lw2E

Patrice T

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

Patrice T

И вы ничего не видите с отладчиком ?

Member 13528039

Я вижу, что функция возвращает неверное значение. Можете ли вы помочь мне решить эту проблему?

Patrice T

Обновите свой вопрос с помощью этой информации, указав имя функции, пример ввода, фактический вывод и ожидаемый вывод.

Теперь вам нужно применить отладчик к функции и посмотреть, как она строит неверное значение.

Richard MacCutchan

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

Рейтинг:
0

OriginalGriff

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

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
myaverage.DisplayAverage();

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Вы можете использовать отладчик, чтобы точно посмотреть, что находится в переменных и памяти во время выполнения вашего кода, и посмотреть, является ли это тем, что вы ожидали. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!