2013-02-09 87 views
0

当我在linux上使用GCC进行编译时,由于我在等待输入,因此“hi”出现。我不想使用scanf,并且想要知道为什么hi在显示,而我要求用户输入名称。另外,当我想打印刚刚通过的文件的名称时,我会得到垃圾字符。在netbeans中,我得到了我想要的。但在Linux上,它决定行为怪异。请帮助在输入系统调用期间添加了额外的字符串C

代码:

int main(int argc, char** argv) 
{ 
char val[70]; 
     if(write(1, "Please input your name", 36)!=36) 
     { 
       return -1; 
     } 
     if(read(0, val, 36) < 0) 
     {} 

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

printf("Yo");//THIS IS PRINTING OUT WAY BEFORE IT IS CALLED, ANY VARIABLE WITH A STRING  GETS PRINTED OUT, EVEN WITHOUT PRINTF BEING INVOKED 
} 

输出:

Please input the file nameYo: hi 
hi 
???Om?0?a?Sm? <<WHAT IS THIS? I DONT GET THIS ON NETBEANS 
+2

你确定'“请输入你的名字”'是36个字符 - 我不总是计数非常好,但我得到22或一些这样的。 ..当然,“Yo”可能会在这个字符串后不久存储... – 2013-02-09 01:06:16

+1

你的输出字符串不是36字节,所以你对系统说谎,但期望它做正确的事情。这通常不起作用。 – 2013-02-09 01:08:20

+3

不要将调用混合在一起读取/写入到调用C++ stdio函数(如fread/fwrite/printf)。使用其中一个或另一个,或者你会因缓冲输入和输出的方式而感到困惑。 – 2013-02-09 01:09:38

回答

3

的第三个参数write是你想打印字符串的字节长度。你有36,但你提供的字符串只有22个字节长。更改代码,如下所示将像你预料到:

int main(int argc, char** argv) 
{ 
    char val[70]; 
    if(write(1, "Please input your name", 22)!=22) 
    { 
     return -1; 
    } 
    if(read(0, val, 36) < 0) 
    {} 

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

    printf("Yo");//THIS IS PRINTING OUT WAY BEFORE IT IS CALLED, ANY VARIABLE WITH A STRING  GETS PRINTED OUT, EVEN WITHOUT PRINTF BEING INVOKED 
} 

请注意,你或许应该考虑使用printfscanf让你不会担心字节长度那么多。

这可能是这样的:

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    char val[70]; 
    printf("Please input your name"); 

    if(scanf("%69s", &val) == 1) 
     printf(val); 

    printf("Yo"); 
} 
+0

我怎么知道用户刚刚通过我没有调用libc函数的长度?例如,如果我想打印出用户刚刚存储的内容,则需要传递确切的字节,否则我将得到垃圾字符。 – user1888502 2013-02-09 01:10:34

+0

如果你看到了,现在在我的阅读中,我假设它是36字节 – user1888502 2013-02-09 01:12:47

+0

@ user1888502-为什么你不能使用libc中的任何东西?你知道'read()'和'write()'是libc的一部分,对吗? – bta 2013-02-09 01:19:19

相关问题