2015-12-16 2 views
0

Вот мой код, и системный вызов работает, когда есть только одно слово без пробела или чего-либо между ними (например, enter ...).Функция fgets не читает первый символ на входе

Например, когда я использую «pwd», вызов работает, но когда я использую что-то вроде ls -l или, скажем, «cd file1 file2», он стирает первый символ и не принимает во внимание ничего после пробела.

Поэтому, когда я пишу «cd file1 file2», остается только «d» «cd». Что я могу сделать, чтобы этого не случилось?

#include <stdlib.h> 
#include <stdio.h> 
#include "Expert_mode.h" 

void Expert_mode() 
{ 
    printf("Your are now in Expert mode, You are using a basic Shell (good luck) \nWe added the commands 'read_history', 'leave' and 'Easter_egg'. \n"); 

    int a = 0; 
    while(a == 0) 
    { 

     char* line; 

     getchar(); 

     printf("Choose a command : \n"); 

     line = malloc(100*sizeof(char)); 

     fgets(line, 100, stdin); 

     if(strcoll(line, "leave") == 0) 
     { 
      a = 1; 
     } 
     else if(strcoll(line, "read_history") == 0) 
     { 
      //read_history(); 
     } 
     else if(strcoll(line, "Easter_egg") == 0) 
     { 
      // Easter_egg(); 
     } 
     else 
     { 
      system(line); 
     } 
    } 
} 
+0

Если вы собираетесь выделить буфер фиксированного размера, то почему бы не использовать массив? Тогда у вас не будет утечки памяти. –

ответ

3

Это потому, что у вас есть getchar(); вызов передfgets() вызова. Таким образом, он потребляет первый символ, и только остальная часть ввода считывается fgets(). Убери это.

Кроме того, обратите внимание, что fgets() также будет читать конечную новую строку, если доступно пространство для буфера. Вы хотели бы обрезать его.

Вы можете использовать strchr() для удаления символа новой строки, если он присутствует:

fgets(line, 100, stdin); 
char *p = strchr(line, '\n'); 
if (p) *p = 0; 
+0

Большое вам спасибо ^^, но как я могу использовать код, который вы написали, и почему именно? Извините за глупые вопросы. Я довольно новичок в кодировании. –

+0

@ LucaS-c Просто скопируйте последние две строки из моего ответа после того, как вы звоните в ваш код. Это так просто :) –

+0

Спасибо большое, я понимаю, что это делает сейчас, я чувствую себя глупо>< –

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