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

の 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
}

バイト長についてそれほど心配する必要がないように、おそらくprintfand の使用を検討する必要があることに注意してください。scanf

それは次のようになります。

#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 に答える