2013-02-09 2 views
0

Когда я скомпилирую это с помощью GCC на linux, так как я жду ввода, появляется сообщение «hi». Я не хочу использовать scanf и хочу знать, почему привет отображается, когда я прошу пользователя ввести имя. Также, когда я хочу распечатать имя файла, который был только что передан, я получаю символы мусора. В 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», вероятно, будет храниться вскоре после этой строки ... –

+1

Ваша строка вывода не 36 байт, поэтому вы лжете системе, но ожидайте, что она поступит правильно. Обычно это не работает. –

+3

Не смешивайте вызовы для чтения/записи с вызовами функций C stdio, таких как fread/fwrite/printf. Используйте тот или другой, или вы будете очень смущены тем, как они будут буферизовать ввод и вывод. –

ответ

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 
} 

Обратите внимание, что вы, вероятно, следует искать в использовании printf и 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"); 
} 
+0

Как узнать длину того, что только что передал мне пользователь, не вызвав функцию libc? Например, если я хочу распечатать то, что только что хранил пользователь, мне нужно передать точные байты, иначе я получу мусорные символы. – user1888502

+0

, если вы видите, прямо сейчас в моем чтении я предполагаю, что это 36 байт – user1888502

+0

@ user1888502- Почему вы не можете использовать что-либо из libc? Вы понимаете, что 'read()' и 'write()' являются частью libc, не так ли? – bta

Смежные вопросы