0

当我在 linux 上使用 GCC 编译它时,当我等待输入时,“hi”出现了。我不想使用 scanf,并且想知道为什么在我要求用户输入名称时显示 hi。此外,当我想打印刚刚通过的文件的名称时,我会得到垃圾字符。在netbeans中,我得到了我想要的。但在 linux 上,它决定表现得很奇怪。请帮忙

代码:

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
4

1 回答 1

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");
}
于 2013-02-09T01:08:00.900 回答