所以我正在读取一个由空格分隔的数字文件,我试图将这些数字存储到一个整数数组中。不过我做错了什么,因为我一直在数组中得到零。
int main(int argc, char *argv[]){
FILE *param;
char temps[500];
double holder[500];
param = fopen(argv[1],"r");
int u = 0;
while ((temps[u] = fgetc(param)) != EOF)
u++;
char *pch;
int v = 0;
pch = strtok(temps," ");
while (pch != NULL) {
holder[v] = atof(pch);
pch = strtok(NULL," ");
v++;
}
}
最佳答案
您需要nul
终止数组以使其成为c 中的字符串.
while ((temps[u] = fgetc(param)) != EOF)
u++;
temps[u] = '\0';
不这样做并将 temps
传递给 strtok()
会调用未定义的行为,因为它是未定义的,所以无法解释程序的行为。
你还应该:
- 在尝试访问
argv
之前检查argc
的值。 - 检查
fopen()
的返回值。 - 此外,
fgetc()
返回int
而不是char
,因此EOF
会导致问题你的代码,除此之外你不希望EOF
无论如何都在数组中。 - 为清楚起见,避免将声明与代码混在一起。
这是你自己修复的程序,它应该可以正常工作,前提是
- 输入文件退出并可读。
- 输入文件包含适当的数据。
int main(int argc, char **argv)
{
FILE *param;
char temps[500];
double holder[500];
int u;
char *pch;
int ch;
int v;
if (argc < 2)
{
fprintf(stderr, "Invalid number of arguments, a file path is expected.\n");
return -1;
}
param = fopen(argv[1],"r");
if (param == NULL)
{
fprintf(stderr, "error trying to open `%s'\n", argv[1]);
return -1;
}
u = 0;
while ((ch = fgetc(param)) != EOF)
temps[u++] = ch;
temps[u] = '\0';
v = 0;
pch = strtok(temps, " ");
while (pch != NULL)
{
char *endptr;
holder[v] = strtol(pch, &endptr, 0);
if (*endptr != 0)
fprintf("warning: these characters were not convetible -- %s\n", endptr);
pch = strtok(NULL, " ");
v++;
}
}
关于将 char 数组从读取文件转换为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33005287/