不同顺序的相同声明在gcc中产生不同的结果

时间:2013-10-22 21:20:54

标签: c file-io

问题出在第7行:int ret=3, x, y;

如果我首先声明y(如第8行),结果将是 不同

我的电脑上的

现在只打印Y值 声明中的更改仅打印X

的值

生成文件

gcc -g -o open_file_test open_file_test.c;
./pen_file_test input

CODE:

#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;
}

INPUT_FILE

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

2 个答案:

答案 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