我有一个文件,其中包含以空格分隔的数字并输入。我想找到最大值和最小值:
#include <stdio.h>
#include <conio.h>
int main()
{
char nums[500];
int min,max,i,a;
FILE * file;
file = fopen ("test.txt", "r");
i=0;
while( fscanf(file, "%d,", &a) > 0 )
{
nums[i++] = a;
}
for(i=0; i<=sizeof(nums); i++){
if (nums[i]>max) max=nums[i];
if (nums[i]<min) min=nums[i];
}
printf("Maximum: %d\n", max);
printf("Minimum: %d", min);
fclose (file);
getch();
}
我总是得到:
Maximum: 2686820
Minimum: -128
好的,所以我将char nums[500]
更改为int nums[500]
。我初始化了max=0
和min=INT_MAX
(使用<limits.h>
)。 它仍然给我一个随机值。
如果数字形成文件更改,我将如何前进?有没有一种方法来初始化一个数组与文件内的数字的特定长度?
答案 0 :(得分:4)
您没有初始化min
和max
变量。未初始化的非静态局部变量(如min
和max
变量)具有不确定值,实际上它们看似随机。在没有初始化的情况下使用它们会导致undefined behavior。
您也没有初始化所有数组,这意味着您未初始化的值 也具有不确定的值。
为了增加对伤害的侮辱,你也超越了阵列的范围,这也导致了未定义的行为。
哦,如果您从文件中读取的值大于char
中的值,则会被截断。
答案 1 :(得分:2)
此外,您在int
数组中存储从文件中读取的char
值,因此精度会降低。
答案 2 :(得分:1)
你盲目地认为该文件包含不超过500个数字 - 这是正确的吗? 你盲目地假设文件中的数字符合char范围 - 这是正确的吗?
然后for循环中的sizeof(nums)总是返回500,那么如果文件实际包含的数字少于500,会发生什么?您访问尚未初始化或包含垃圾的内存。
然后你不初始化min和max,它们也用当时在内存中找到的值初始化。
(噢,我没有看到其他答案的暗示......)
答案 3 :(得分:0)
除了其他帖子之外,这是解决问题的解决方案(应该添加一点错误,检查来自fscanf
的返回值
int min,max,i,a;
FILE * file;
file = fopen ("test.txt", "r");
fscanf(file, "%d,", &a);
min = max = a;
while( fscanf(file, "%d,", &a) > 0 )
{
if (min > a) min = a;
if (max < a) max = a;
}
答案 4 :(得分:0)
此外,你提到了
包含数字的文件,以空格分隔并输入。
所以,你必须写fscanf(file, "%d", &a);
而不是fscanf(file, "%d,", &a);
这意味着你必须用格式化字符串中的空格替换逗号。
答案 5 :(得分:0)
the following code corrects the problems,
compiles cleanly,
demonstrates a proper error handling technique
eliminates the portability problem
eliminates unneeded variables
because a space is part of the 'white space' definition and
the %d input conversion format specifier skips over white space,
so no extra spacing in the scanf format string.
#include <stdio.h>
#include <stdlib.h> // exit(), EXIT_FAILURE
#include <limits.h> // INT_MAX, INT_MIN
int main()
{
int min = INT_MAX;
int max = INT_MIN;
int a; // current value read from file
FILE * file = NULL;
if( NULL == (file = fopen ("test.txt", "r") ) )
{ // then, fopen failed
perror( "fopen for test.txt failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
while( fscanf(file, "%d", &a) )
{
if( a < min ) min = a;
if( a > max ) max = a;
} // end while
printf("Maximum: %d\n", max);
printf("Minimum: %d\n", min); // '\n' causes output to terminal
fclose (file);
getchar();
return( 0 );
} // end function: main