为什么我的功能不等待输入?

时间:2012-12-02 03:26:19

标签: c input

我编写了一个函数,在按下Enter键之前读取未知长度的字符串并返回一个char指针。当我从一个开关盒内部调用该函数时,它不会等待我的输入。

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

开关盒(我在开关块外面有一个char * ptr = NULL ):

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

输出:

  

输入空格分隔的EXACT或RELATIVE文件路径:得到它:

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-1)

我能够找到“以某种方式”解决此问题的解决方案是在第一次getchar()调用后立即添加printf()不确定为什么会有效!