-4

所以这是我的问题,鉴于此代码,在请输入您的姓名之前添加的几乎所有内容都将被忽略,并且自动运行的第一条指令(甚至没有首先检查 x 是否为 5,输入您的姓名,然后是前面的指令到它运行。因此,如果程序的第一行是 printf,那将被忽略并立即要求输入,然后打印 printf 语句,即使它是第一个。请帮助

int main(int argc, char** argv)
{
    char val[70];
    int x=3;
    if(x>5)
    {
        if(write(1, "Please input your name", 22)!=22)
        {
            return -1;
        }

        if(read(0, val, 36) < 0)
        {}

        if(write(1, val, 36)!=36)
        {}
    }
}
4

2 回答 2

1

printf 适用于stdoutFILE*。read() 和 write() 调用直接作用于文件描述符。

FILE* 通常是缓冲的,这意味着您 printf 的内容驻留在程序的缓冲区中,直到它被刷新。而 write() 将数据直接发送到操作系统,而在您的应用程序中没有任何缓冲。

所以刷新 FILE* 缓冲区以使输出出现:

int main(int argc, char** argv)
{
  char val[70];
  int x=3;
  printf("Hello");
  fflush(stdout);

如果 stdout 是您的终端,它通常会在您编写换行符时自动刷新,例如 printf("Hello\n");

于 2013-02-09T02:16:49.873 回答
1

你所说的不是发生的事情。您的 main 函数将立即返回 0。这是一个调试示例:

(gdb) break main
Breakpoint 1 at 0x40074b: file ./test.cpp, line 6.
(gdb) run
Starting program: /tmp/test 

Breakpoint 1, main (argc=1, argv=0x7fffffffe528) at ./test.cpp:6
6       int x=3;
Missing separate debuginfos, use: debuginfo-install glibc-2.16-28.fc18.x86_64 libgcc-4.7.2-8.fc18.x86_64 libstdc++-4.7.2-8.fc18.x86_64
(gdb) next
7       if(x>5)
(gdb) 
19  }
(gdb) 
0x00007ffff7744a05 in __libc_start_main () from /lib64/libc.so.6
(gdb) 
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 4962) exited normally]
(gdb) 

事实上,启用优化后,if其主体的整个检查都被作为死代码消除,从而产生了一个不错的 main 函数,如下所示:

int main()
{
    return 0;
}

通过查看二进制代码 ( objdump -CD -M intel) 可以确认这一点:

00000000004004c0 <main>:
  4004c0:       31 c0                   xor    eax,eax
  4004c2:       c3                      ret    
  4004c3:       90                      nop

也许现在是您学习如何调试代码的好时机。首先阅读一些GDB 文档

祝你好运!

于 2013-02-09T02:20:33.953 回答