将文件的值存储到数组中会导致奇怪的行为
Storing values of file into array leads to weird behaviour
假设我有文件
5f2
3f6
2f1
还有代码:(printf 应该打印第二个数字(即 2、6 和 1),但它没有
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main (int argc, char * argv[])
{
FILE *ptr;
char str[100];
char * token;
int a, b, i;
int arr[4];
if(argc > 1)
{
ptr = fopen(argv[1],"r");
if(ptr == NULL)
{
exit(1);
}
}
else
{
exit(1);
}
//And I'm looking to parse the numbers between the "f" so..
while(fgets(str,100,ptr) != NULL)
{
token = strstr(str,"f");
if(token != NULL)
{
a = atol(str); // first number
b = atol(token+1); // second number
arr[i] = b; // store each b value (3 of em) into this array
}
i++;
printf("Values are %d\n",arr[i]); //should print 2,6 and 1
}
}
我曾尝试将 printf 移到循环外,但这似乎打印出更奇怪的结果,我之前看过有关将文件中的整数存储到数组中的帖子,但是由于这涉及到使用 strstr,我不确定程序是否相同。
int i,j=0;
while(fgets(str,sizeof(str),file) != NULL)
{
size_t n = strlen(str);
if(n>0 && str[n-1] == '\n')
str[n-1] = '[=10=]';
i = str[strlen(str)-1] - '0'; /* Convert the character to int */
printf("%d\n",i);// Or save it to your int array arr[j++] = i;
}
只需移动到所示的最后一个字符并将其作为整数打印出来。
PS: fgets()
带有一个换行符,你需要抑制它,如图所示
你永远不会初始化 i
,然后你正在读入 arr[i]
(只是 碰巧 不会在那里崩溃),然后递增 i
(到 "undefined value + 1"),然后打印 arr[i]
——即,您正在写入和读取未初始化的内存。
另外,你的FILE *
是ptr
,不是file
。并且你应该养成使用 strtol()
而不是 atol()
的习惯,因为前者允许你正确地检查是否成功(并从错误中恢复)。
假设我有文件
5f2
3f6
2f1
还有代码:(printf 应该打印第二个数字(即 2、6 和 1),但它没有
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main (int argc, char * argv[])
{
FILE *ptr;
char str[100];
char * token;
int a, b, i;
int arr[4];
if(argc > 1)
{
ptr = fopen(argv[1],"r");
if(ptr == NULL)
{
exit(1);
}
}
else
{
exit(1);
}
//And I'm looking to parse the numbers between the "f" so..
while(fgets(str,100,ptr) != NULL)
{
token = strstr(str,"f");
if(token != NULL)
{
a = atol(str); // first number
b = atol(token+1); // second number
arr[i] = b; // store each b value (3 of em) into this array
}
i++;
printf("Values are %d\n",arr[i]); //should print 2,6 and 1
}
}
我曾尝试将 printf 移到循环外,但这似乎打印出更奇怪的结果,我之前看过有关将文件中的整数存储到数组中的帖子,但是由于这涉及到使用 strstr,我不确定程序是否相同。
int i,j=0;
while(fgets(str,sizeof(str),file) != NULL)
{
size_t n = strlen(str);
if(n>0 && str[n-1] == '\n')
str[n-1] = '[=10=]';
i = str[strlen(str)-1] - '0'; /* Convert the character to int */
printf("%d\n",i);// Or save it to your int array arr[j++] = i;
}
只需移动到所示的最后一个字符并将其作为整数打印出来。
PS: fgets()
带有一个换行符,你需要抑制它,如图所示
你永远不会初始化 i
,然后你正在读入 arr[i]
(只是 碰巧 不会在那里崩溃),然后递增 i
(到 "undefined value + 1"),然后打印 arr[i]
——即,您正在写入和读取未初始化的内存。
另外,你的FILE *
是ptr
,不是file
。并且你应该养成使用 strtol()
而不是 atol()
的习惯,因为前者允许你正确地检查是否成功(并从错误中恢复)。