Erebus_22 Ответов: 2

Введенная строка анализируется дает неверный результат


#include<stdio.h>
#include<string.h>
main()
{
	char* newme(char* input1);
	char newi[100],data[100]="10,10,50,120,20,30,10,140,205";
	strcpy(newi,newme(data));
	printf("%s");
	return 0;
}
char* newme(char* input1)
{
	int Data[20],i=0;
	float A,B,C,D,E,F,G,H,I;
	char seps[]=",";
	char* token;
	char input2[25];
	strcpy(input2,input1);
	printf("%s",input2);
	token=strtok(input2,seps);
	while(token!=NULL)
	{
		Data[i]=atof(token);
		token=strtok(NULL,seps);
		i++;
		printf("%f",Data[i]);
	}
	printf("\n%d",i);
     A=Data[0];B=Data[1];C=Data[2];D=Data[3];E=Data[4];F=Data[5];G=Data[6];H=Data[7];I=Data[8];
	printf("\n data =%f %f %f %f %f %f %f %f %f",A,B,C,D,E,F,G,H,I);
	return input2;
}

Выход должен быть таким же, как и вход, но вместо этого он дает -1.#INDO для большинства значений

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

Увеличение размера буфера, изменение atof на atoi

2 Ответов

Рейтинг:
0

CPallini

Я публикую здесь вывод современного компилятора с 'все предупреждения активированы'вариант (а именно gcc -Wall) вызывается в вашем коде:

foo.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main()
 ^
foo.c: In function ‘main’:
foo.c:8:9: warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat=]
  printf("%s");
         ^
foo.c: In function ‘newme’:
foo.c:23:11: warning: implicit declaration of function ‘atof’ [-Wimplicit-function-declaration]
   Data[i]=atof(token);
           ^
foo.c:26:10: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
   printf("%f",Data[i]);
          ^
foo.c:30:9: warning: function returns address of local variable [-Wreturn-local-addr]
  return input2;
         ^
foo.c:29:2: warning: ‘I’ is used uninitialized in this function [-Wuninitialized]
  printf("\n data =%f %f %f %f %f %f %f %f %f",A,B,C,D,E,F,G,H,I);
  ^
foo.c:29:2: warning: ‘H’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘G’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘F’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘E’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘D’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘C’ is used uninitialized in this function [-Wuninitialized]



Теперь давайте рассмотрим вышеописанный беспорядок...
foo.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main()
 ^
Вы всегда должны указывать тип возвращаемого значения в C функция (в данном конкретном случае вам повезло, потому что по умолчанию, int, правильно).


foo.c: In function ‘main’:
foo.c:8:9: warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat=]
  printf("%s");
         ^
Вы не указали необходимый аргумент (строку для печати).

foo.c: In function ‘newme’:
foo.c:23:11: warning: implicit declaration of function ‘atof’ [-Wimplicit-function-declaration]
   Data[i]=atof(token);
           ^
Вы должны включить stdlib.h для того чтобы использовать atof.

foo.c:26:10: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
   printf("%f",Data[i]);
          ^
Существует несоответствие между спецификатором формата и типом переменной для распечатки (обычно вам нужно либо изменить спецификатор формата типа переменной).


foo.c:30:9: warning: function returns address of local variable [-Wreturn-local-addr]
  return input2;
         ^
Это должно заставить звенеть колокольчик очень громко в вашей голове, потому что обычно это первый признак приближающейся катастрофы: после выполнения функции локальная переменная больше не существует.


foo.c:29:2: warning: ‘I’ is used uninitialized in this function [-Wuninitialized]
  printf("\n data =%f %f %f %f %f %f %f %f %f",A,B,C,D,E,F,G,H,I);
  ^
foo.c:29:2: warning: ‘H’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘G’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘F’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘E’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘D’ is used uninitialized in this function [-Wuninitialized]
foo.c:29:2: warning: ‘C’ is used uninitialized in this function [-Wuninitialized]
Распечатка неинициализированных переменных обычно дает причудливые результаты.


Суть в следующем: компилятор - ваш друг, используйте его с умом.


Erebus_22

Остальная часть кода в порядке, возвращаемое значение будет скопировано в другую переменную, потому что оно временное. Основное значение функции по умолчанию - int . %S-это посторонний оператор в main . На самом деле проблема заключается в пользовательской функции
< pre>
токен=strtok(input2, seps);
а(знак!=Нуль)
{
Data[i]=atof(токен);
токен=strtok(NULL, seps);
я++;
printf ("%f", Data[i]);
}
printf ("\n%d", i);
A=Данные[0]; B=Данные[1]; C=Данные[2]; D=Данные[3]; E=Данные[4]; F=Данные[5];G=Данные[6]; H=Данные[7]; I=Данные[8];
printf ("\n data =%f %f %f %f %f %f %f % f %F", A, B, C, D, E, F, G, H, I);

< / pre>
Возвращаемые значения должны быть значениями, переданными функции, но это не так, вот в чем проблема.
Спасибо за Ваш вклад, но главной проблемой было исключение stdlib.

Рейтинг:
0

Patrice T

Попробуйте заменить

i++;
printf("%f",Data[i]);

около
printf("%f",Data[i]);
i++;

это может помочь

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

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

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.


Erebus_22

Спасибо но главной проблемой был stdlib