2

问题在第 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),有人可以解释原因吗?

4

2 回答 2

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一次读取一行,然后再解析出这些值。

于 2013-10-22T21:23:51.190 回答
1

在这条线上:

ret=fscanf(inputFile,"%d %d %s\n", &x, &y, &chr);

您的fscanf格式有%s,表示“字符串” (几个字符,以 NULL 终止符结尾),但数据的匹配变量chr只有一个字符,不能处理多个字符。

要修复它,我建议使用格式化程序%c (表示单个字符)而不是%s.

于 2013-10-22T21:23:28.610 回答