问题出在第7行:int ret=3, x, y;
如果我首先声明y(如第8行),结果将是 不同
我的电脑上的现在只打印Y值 声明中的更改仅打印X
的值gcc -g -o open_file_test open_file_test.c;
./pen_file_test input
#include <stdio.h>
#include <stdlib.h>
int worldsize = 0;
int main(int argc, char const *argv[]){
int ret=3, x, y;
//int ret=3, y, x;
char chr;
int teste;
FILE * inputFile;
inputFile = fopen(argv[1],"r");
teste = fscanf(inputFile,"%d", &worldsize);
printf("Tamanho: %d\n", worldsize);
while(1){
ret=fscanf(inputFile,"%d %d %s\n", &x, &y, &chr);
if(ret != 3)
break;
printf("x: %d y: %d\n", x, y);
}
printf("End File :D\n");
return 0;
}
10 1 0 w 2 1 s 6 9 w 3 7 w 5 0 s 1 5 t 1 5 t 7 5 t 9 7 t 9 3 t 0 0 i
Tamanho: 10 x: 0 y: 0 x: 0 y: 1 x: 0 y: 9 x: 0 y: 7 x: 0 y: 0 x: 0 y: 5 x: 0 y: 5 x: 0 y: 5 x: 0 y: 7 x: 0 y: 3 x: 0 y: 0 End File :D
在我的电脑上只阅读Y和我同事的相同代码 电脑只能读取X,而在另一位朋友的电脑上工作正常 (阅读X和Y),有人可以解释原因吗?
答案 0 :(得分:5)
您的代码中有未定义的行为:
fscanf(inputFile,"%d %d %s\n", &x, &y, &chr);
将字符串读入chr
,这是一个char
个变量。即使字符串包含单个字符,也会在其后写入空终止符。这可能会溢出到堆栈中的整数。
如果您想要一个字符,请使用%c
:
fscanf(inputFile,"%d %d %c\n", &x, &y, &chr);
如果你更喜欢一个字符串,那么使chr
一个char
数组大到足以容纳任何潜在的字符串(加上一个空终止符)。或者,使用fgets
一次读取一行,然后稍后解析这些值。
答案 1 :(得分:1)
在这一行:
ret=fscanf(inputFile,"%d %d %s\n", &x, &y, &chr);
您的fscanf
格式有%s
,这意味着“字符串”(几个字符,以NULL终结符结尾),但是数据的匹配变量{ {1}}只是一个字符,不能处理多个字符。
要解决此问题,我建议您使用格式化程序chr
(表示单个字符)而不是%c
。