Erebus_22 Ответов: 3

Значение пустое, но присвоение показывает значение


<pre lang="C#">#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;
main()
{
	char* newme(char* input1);
	char newi[100],data[100]=&quot;10,10,5,2,2,3,1,14,25&quot;;
	strcpy(newi,newme(data));
	//printf(&quot;%s&quot;);
	return 0;
}
char* newme(char* input1)
{
	int Data[10],i=0;
	float A,B,C,D,E,F,G,H,I;
	char seps[]=&quot;,&quot;;
	char* token;
	char input2[25];
	strcpy(input2,input1);
	printf(&quot;%s&quot;,input2);
	token=strtok(input2,seps);
	while(token!=NULL)
	{
		Data[i]=atoi(token);
		token=strtok(NULL,seps);		
		printf(&quot;%f&quot;,i)
		;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(&quot;%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f&quot;,Data[0],Data[1],Data[2],Data[3],Data[4],Data[6],A,B,C,D,E,F,G,H,I)
	
	;return input2;
}</pre>

Выход массива данных равен 0.000, но выход букв "A-I" - это значение, переданное функции.
Здесь значения Data[] при печати не содержат никаких значений, но при присвоении другим переменным содержат значение, почему это так ?
Заранее спасибо

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

Типы данных были изменены, но результат остался прежним

[no name]

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

Erebus_22

Отладчик показывает правильное значение, но функция печати не печатает правильное значение, почему это так

[no name]

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

3 Ответов

Рейтинг:
8

programify

Попробуйте этот код

char * newme (char * input1)
{
	int       Data [10] ;
     int       i = 0 ;
	float     A,B,C,D,E,F,G,H,I ;
	char      seps [] = "," ;
	char *    token ;
	char      input2 [25] ;

	lstrcpy (input2, input1) ;
	printf ("%s\n", input2) ;
	token = strtok (input2, seps) ;
	while (token != NULL)
	{
		Data [i] = atoi (token) ;
		token = strtok (NULL, seps) ;		
		printf ("%d) %d\n", i, Data [i]) ;
		i ++ ;
	}
     printf ("\n") ;
	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] ;

     for (i = 0 ; i < 9 ; i ++)
	     printf ("%d) %d\n", i, Data[i]) ;

	printf ("A=%f\n", A) ;
	printf ("B=%f\n", B) ;
	printf ("C=%f\n", C) ;
	printf ("D=%f\n", D) ;
	printf ("E=%f\n", E) ;
	printf ("F=%f\n", F) ;
	printf ("G=%f\n", G) ;
	printf ("H=%f\n", H) ;
	printf ("I=%f\n", I) ;
	return (input2) ;
}


Проблема, с которой вы столкнулись, заключается в попытке отобразить целое число с помощью %f, это для поплавков!

%d может быть для целых чисел.

Найдите "printf format" для получения подробной информации о том, как отображать данные с помощью printf().

:)


Рейтинг:
22

Erebus_22

Отладчик показывает правильное значение переменных данных, но его функция печати не печатает правильное значение

Patrice T

Да, вы говорите printf печатать поплавки и даете целые числа.

Рейтинг:
15

W∴ Balboos, GHB

Вы должны понимать, что на самом деле все данные в памяти-это один и тот же тип информации. Является ли это строкой, целым числом, плавающей точкой и т. д.-Это то, как интерпретируются данные. Если вы знаете, что такое "кастинг", то вы должны знать об этом.

Теперь, когда вы хотите напечатать значение, скажем, это целое число, все биты обрабатываются как простые двоичные для интерпретации, и они просто добавляются (если 1) или игнорируются (если 0). Если вы скажете системе, чтобы она рассматривала его как поплавок, то она должна рассматривать некоторые значения как степени десяти, хотя они тоже хранятся в двоичном виде.

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

Значение 30h может быть интерпретировано как 48 (байт), символ пробела (как символ char), указатель на начало памяти как строка (возможен сбой программы или могут быть напечатаны сотни страниц мусора) и так далее.

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

Понимание и опыт в конечном итоге помогут вам пройти через это.