【问题标题】:Handle inputs on stdin in C在 C 中处理标准输入上的输入
【发布时间】:2013-12-15 19:22:12
【问题描述】:

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

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

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

问候

【问题讨论】:

  • 你真的要从标准输入读取还是解析命令行参数?
  • 来自手册页:如果找到 s1(或其前 n 个字节),则 strcmp() 和 strncmp() 函数分别返回小于、等于或大于零的整数,小于、匹配或大于 s2。
  • @GradyPlayer 从标准输入读取。 @l drumm 我是新的@programming,是不是说我不能用strcmp?
  • strcmp() 返回一个整数值,表示字符串之间的关系:零值表示两个字符串相等。

标签: c posix libc


【解决方案1】:

你为什么要使用realloc()?我在这里看不到动态分配的任何理由。为什么不能只处理buffer 内容?

按照C99标准:

7.19.7.2 fgets函数概要

...

fgets 函数读取的次数最多小于 1 从流指向的流中由 n 指定的字符 into s 指向的数组。之后没有额外的字符被读取 换行符(保留)或文件结尾之后。一个空 在读入最后一个字符后立即写入字符 数组。

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

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

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

【讨论】:

  • 好的!您对realloc 的看法是正确的。我只是试了试又试了,突然这个邪恶的结构诞生了;)。我改变了它,我只是在使用buffer[FIXED_SIZE] no mal,cal,real-loc !!!我认识到 strcmp 的问题。我将其更改为strcmp(command, "close") == 0,但它不起作用。因此,如果我输入 close 它不会识别它:( 我还能如何比较两个字符串?
  • 再次查找 fgets() 文档 - 您可以在最后一个符号后使用 \n 接收它,然后复制输入的单词。
  • 其实你应该检查' ''\n''\0'来停止扫描。
【解决方案2】:

当您在realloc()-ing 时,重新分配内存区域的地址可以更改。但是您没有将此更改分配给变量whole_entrie。问题来了:

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

【讨论】:

  • 对不起,我还不是一个好的程序员,我找不到解决这个错误的方法!或许你可以再给我一个提示,好吗?
  • 对不起!将它复制到 stackeoverflow 时出了点问题(我不得不更改变量名,因为我的老师不想在互联网上看到他学生的代码(抄袭等),这句话是:whole_entrie = (realloc(整体入口,strlen(缓冲区)+ 1);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
相关资源
最近更新 更多