【问题标题】:Application behaves differently on different machines应用程序在不同机器上的行为不同
【发布时间】:2020-10-17 07:10:35
【问题描述】:

我正在学习流,并从教科书中复制了以下应用程序。当我的朋友在他的 Windows 机器上编译并运行时,它运行良好。当我在我的 Ubuntu 18.04 机器上运行应用程序时,输入工作正常,但这些值似乎对应用程序没有任何影响,即输入 0 不会导致程序退出。我的输出在代码下方。

在不同机器上编译时会导致不同的行为,为什么这在我的机器上不起作用?

int main(int argc, char* argv[]) { 文件 *fpt; 字符字节; long int where,move; 如果(argc!= 2) { printf("用法:文件搜索文件名\n"); 返回(0); } fpt = fopen(argv[1], "r"); 如果(fpt == NULL) { printf("无法打开文件 %s 进行读取\n", argv[1]); 返回(0); } 而(1) { 其中 = ftell(fpt); fread(&byte,1,1,fpt); fseek(fpt,-1,SEEK_CUR); printf("字节 %d: %d (%c)\n", where, byte, byte); printf("输入 #bytes (+ or -) 移动,或 0 退出:"); scanf("%d", &move); printf("移动: %d\n", 移动); 如果(移动 == 0) 休息; fseek(fpt,移动,SEEK_CUR); } fclose(fpt); }

输出

jonathon@dev1:~/hoover/ch5/build$ ./fileseek  text.txt 
Byte 0: 84 (T)
Enter #bytes (+ or -) to move, or 0 to quit: 0
move: 0
Byte 0: 84 (T)
Enter #bytes (+ or -) to move, or 0 to quit: 1
move: 1
Byte 0: 84 (T)
Enter #bytes (+ or -) to move, or 0 to quit: 2
move: 2
Byte 0: 84 (T)
Enter #bytes (+ or -) to move, or 0 to quit: 3
move: 3
Byte 0: 84 (T)
Enter #bytes (+ or -) to move, or 0 to quit: 4
move: 4
Byte 0: 84 (T)
Enter #bytes (+ or -) to move, or 0 to quit: 5
move: 5
Byte 0: 84 (T)
Enter #bytes (+ or -) to move, or 0 to quit: ^C     

【问题讨论】:

    标签: c stream


    【解决方案1】:

    如果教科书如其所言,那就错了:%dint 的转换说明符,但 movelong int。正确的调用是:

    scanf("%ld", &move)
    

    ,对几个 printf 调用进行了类似的更正。

    它可能会巧合,尤其是当longint 恰好大小相同时(因为它们在 64 位 Windows 中,但在 64 位 Linux 中不同)。然而,对于不匹配,并没有为整个程序定义特定的行为:语言标准允许编译器假设它们所代表的非法行为永远不会发生,并且对于执行这种行为的程序没有任何义务一个动作可以做。

    【讨论】:

    • longint 相同时,它也可以巧合,就像在 CentOS 8 上对我一样。不过,这是完全正确的, OP 代码中的一些字段描述符无法匹配相应的参数,这会产生未定义的行为,并且 OP 的观察结果是一个合理的表现。
    • 这在教科书上真是令人失望。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多