scanf()调用之后的指令被调用两次

时间:2017-10-17 18:51:05

标签: c loops io pthreads scanf

以下计划:

#include <stdio.h>
#include <pthread.h>

char input;

void *
dpy(void *args)
{
        printf("\n[input] = %c\n", input);
}

void *
read(void *args)
{
        pthread_t child;

        printf("Write whatever - press 'F' to end\n");

        do
        {
                scanf("%c", &input);
                printf("begin\n");
                pthread_create(&child, NULL, dpy, NULL);
                pthread_join(child, NULL);
                printf("end\n");
        }
        while (input!='F');

        printf("done\n");
}

void
main ()
{
        pthread_t parent;

        pthread_create(&parent, NULL, read, NULL);
        pthread_join(parent, NULL);
}
  1. 从标准输入读取字符并停在&#39; F&#39;字符, 使用parent主题。
  2. 为用户输入的每个字符打印消息[input] = .., 使用child主题。
  3. 问题

    每条消息都有以下模式:

      

    开始..结束

    scanf调用之后(在read例程的循环内)显示两次,尽管它应该等待下一个scanf调用的下一个字符输入。

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

除了scanf()离开换行的问题之外,还有一些小问题。

  1. 线程功能&#39;原型要求他们返回一个指针。因此read()child()最后必须有return NULL;(或者必要时还有其他值 - 但我不认为您有此需要)。

  2. void main()main()的非标准原型。使用int main(void)或同等的。

  3. 您还应该检查pthread_*函数的返回值;他们可能会失败!

  4. 在scanf(scanf(" %c", &input);)中有一个前导空格会忽略输入中的任何个空格数。因此,它会消耗前一个输入留下的换行符。但总的来说,最好避免使用scanf,而是选择fgets()。见Why does everyone say not to use scanf? What should I use instead?