【问题标题】:Why my function doesn't wait for input?为什么我的函数不等待输入?
【发布时间】:2012-12-02 03:26:18
【问题描述】:

我写了一个函数,它读取一个未知长度的字符串,直到按下 Enter 并返回一个 char 指针。当我从 switch case 内部调用该函数时,它不会等待我的输入。

char *get_paths()
{
    unsigned int length_max = 256; /*Initial length of string*/
    unsigned int current_size; 
    current_size = length_max;

    /* Allocating memory for string input */
    char *tmpStr = malloc(length_max);

    /* Simple check to make sure our pointer is not NULL */
    if(tmpStr != NULL)
    {
        int c = EOF; 
        unsigned int i = 0;

        printf("Enter The EXACT or RELATIVE File Paths Separated by a Space: ");

        /* Accept input until Enter key is pressed or user inserts EOF */
        while((c = getchar()) != '\n' && c != EOF)
        {
            tmpStr[i] = (char)c;
            ++i;

            /* If memory is filled up, reallocate memory with bigger size */
            if(i == current_size)
            {
                current_size = i + length_max;
                /* realloc does magic */
                tmpStr = realloc(tmpStr, current_size); 
            }
        }

        /* A valid string always end with a '\0' */
        tmpStr[i] = '\0';
        printf("Got it: %s \n", tmpStr); /*TODO: REMOVE;; USED FOR TESTING*/
        return tmpStr; 
    }
}

开关盒(我在开关块中有一个字符 *ptr = NULL):

/*File input*/
case 1:
    ptr = get_filepaths();
break;

输出:

输入以空格分隔的确切或相对文件路径:知道了:

【问题讨论】:

  • 对您的代码进行注释很好,但是您的一些 cmets 非常多余,例如“简单检查以确保我们的指针不为 NULL”明显比 if(tmpStr != NULL) 长,而且它没有'不要解释代码尚未解释的任何内容。

标签: c input


【解决方案1】:

您很可能在stdout 上遇到缓冲问题,这是printf 默认设置的。您要么需要显式刷新stdout,要么在第一个printf 语句的末尾添加一个换行符,以强制刷新缓冲区。由于“知道了”语句的末尾有一个换行符,因此会发生两个语句(第一个被缓冲的语句)同时打印到输出,因为第二个语句强制刷新缓冲区。

另一种可能是stdin中可能已经有未读数据,当你在while-loop中调用getchar()时,它会读取之前缓冲的数据,遇到换行符,然后退出循环而不是让您输入新信息。为避免该问题,请执行scanf("%*[^\n]%*c"); 之类的操作,以便将输入消耗到已经在输入中的下一个换行符(包括换行符本身),而不必担心缓冲区溢出。

【讨论】:

  • 在第一次 printf 调用后添加了 fflush(stdout),但不起作用。将 \n 添加到 printf,没有用。 :(
  • 您在调用getchar() 之前清除了输入吗?换句话说,stdin 上可能还有其他一些先前的输入正在被读取?
  • 好吧,为了使用开关,我在另一个函数中使用 scanf 读取了用户输入,我尝试在调用 getchar() 之前添加 fflush(stdin),但它仍然跳过输入。
  • 所以基本上现在在第一个printf 之后我同时拥有fflush(stdin)fflush(stdout)
  • 从不使用fflush(stdin);
【解决方案2】:

我能够找到“以某种方式”解决此问题的解决方案是在第一个 printf() 调用之后添加一个 getchar()不知道为什么会这样!

【讨论】:

  • 您可能在某处有一个scanf(),它会留下一个换行符(read this)。你应该在那里自己清理,而不是在 get_paths() 函数内。
猜你喜欢
  • 2015-05-15
  • 2018-06-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多