在C中处理stdin上的输入

时间:2013-12-15 19:22:12

标签: c posix libc

我是新的@programming,我有以下问题: 我的程序启动命令提示符:如

input>

然后用户输入一个字符串,像merge xyz.txt这样的命令 我终于让它运行了,我的程序只从头开始读到space。所以

  

printf(“%s”,命令);

output: merge

如果用户输入一个字符串,其中命令不是'一个命令或没有值,它应该再次开始打印input>,并且在命令完成后,它应该再次打印input>。我试图将所有内容放入while循环中:

void cmdLine()
{
  char *whole_entrie = calloc(1,1);
  char buffer[BUFFERSIZE];
  int dummy = 0;
  while(dummy == 0)
  {
    printf("input>");
    fgets(buffer, BUFFERSIZE, stdin);
    whole_entrie = realloc(whole_entrie, strlen(buffer) + 1);
    strcpy(whole_entrie, buffer);
    strcpy(buffer, ""); //reset because i thought the programm uses old entries?????ß

    int cnt = 0;
    char command[MAX_COMMAND_LENGTH];

    while(cnt <= MAX_COMMAND_LENGTH)
    {
      if(whole_entrie[cnt] == ' ')
      {
        break;
      }
      else
      {
        command[cnt] = whole_entrie[cnt];
        cnt++;
      }
    }

    if(strcmp(command, "merge") == 1)
    {
      merge();
    }
    else if(strcmp(command, "close") ==1)
    {
      free(whole_entrie);
      dummy = 1;
    }

BUT: 它随机做了别的事情。有时我得到一个双重免费错误,或者当我输入printf()时它返回0或显示merge xxxkdlf等等,有人可以帮助我,我是对这个该死的代码感到沮丧!!!

问候

2 个答案:

答案 0 :(得分:1)

你为什么要使用realloc()?我没有看到任何动态分配的原因。为什么不能只处理buffer内容?

按照C99标准:

  

7.19.7.2 fgets功能概要

     

...

     

fgets函数最多读取的数量少于1   由流指向的流中的n指定的字符   s指向的数组。 a后没有读取其他字符   换行符(保留)或文件结束后。空   在读入最后一个字符后立即写入字符   数组。

还有一点。为什么这么奇怪memcmp()来电?来自man memcmp

  

strcmp()和strncmp()函数返回一个小于的整数,   如果s1(或其前n个字节)是等于或大于零   发现分别小于,匹配或大于s2。

好的,最后(也许)第三。您检查内的空格(“whole_entrie”)是否已停止。但是,如果您只是在最后输入'\n'命令,则会复制它,包括“\n”,以便strcmp()无法检查您的命令。

答案 1 :(得分:0)

当您realloc()时,重新分配的内存区域的地址可能会发生变化。但是,您不会将此更改分配给变量whole_entrie。这是问题所在:

input = realloc(whole_entrie, strlen(buffer) + 1);