fgets函数不读取输入中的第一个字符

时间:2015-12-16 18:50:59

标签: c linux call system 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);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

这是因为您在 getchar();致电前fgets()致电。因此它消耗第一个字符,fgets()只读取其余输入。删除它。

另外,请注意,如果缓冲区空间可用,fgets()也会读取尾随换行符。你可能想修剪它。

您可以使用strchr()删除换行符(如果存在):

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