标签: getchar

取消 getchar()

我有一个可以进行大量处理的小程序。您可以通过按 Enter 键来打印进度。

我实现这一点的方法是在主线程中完成处理,同时我有一个 pthread 不断在 getchar() 上循环以等待输入键。

问题是当我完成处理时。发生这种情况时,主线程完成,但仍然等待按下 Enter 键,因为 getchar() 正在阻塞。

如何“取消”getchar()?

c pthreads getchar

3
推荐指数
1
解决办法
5120
查看次数

发送 EOF 后无法读取任何内容?

#include <stdio.h>
int main()
{
    char c = getchar(); //EOF (ctrl + d )
    while( ( c = getchar() ) != '?' )
    {
        printf( "%d\n", c == EOF );//infinite loop printing 1
    }
}
Run Code Online (Sandbox Code Playgroud)

这里会发生什么?

就好像 EOF 完全阻止读取其后的任何内容?

c infinite-loop eof getchar

3
推荐指数
1
解决办法
83
查看次数

使用`getchar()`终止while循环

对于我的家庭作业,我需要实现Horners算法来在基数之间进行转换.

我被告知要getchar()用于这项任务.但是我遇到了一个问题,当我按下Enter键时,程序不会终止并且只会占用更多的字符.

例:

bryce> ./pa1
Enter the fromRadix:16

Enter the toRadix:2
abc
abc
^C
bryce> 
Run Code Online (Sandbox Code Playgroud)

码:

int readRadixA(int radixA)
{
    char myChar = getchar(); 
    int result = 0; 
    int run = 0; 

    while(myChar != EOF)
    {
        if(myChar == "\n")
            break;

        Horners();

        myChar = getchar(); 
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

我不是要求帮助实施Horners; 我正在寻求帮助以getchar()正确终止.

c getchar

2
推荐指数
1
解决办法
4007
查看次数

在C++中遍历可能包含0xff的十六进制输入

我在我的代码中遍历来自stdin的十六进制输入,我注意到当达到0xff字节时,我无法绕过我的代码.我知道这是因为循环是:

while( (c=getchar()) != EOF)
Run Code Online (Sandbox Code Playgroud)

但是,我不能把它排除在外,因为否则在真正的End-Of-File之后调用getchar并且它会出现段错误.如何正确遍历完整输入?

(对不起,我知道这个看似常见的任务应该有一个简单的答案,但我试着搜索了一段时间但什么都没发现)

c++ hex eof getchar

2
推荐指数
1
解决办法
249
查看次数

用C冲洗输入

我是一名软件工程专业的学生,​​我正在休假,为了在下学期学习更好,我一直在编写各种控制台应用程序来练习.但是我遇到了一个问题,我需要从用户那里得到整数输入.我一直在使用fgets来获取字符串stdin然后使用sscanf来获取整数(已经工作正常)但是如果用户输入的数量超过了我的缓冲区大小,则会在流中保留尾随字符(包括跳过我的下一个调用的换行符)fgets).我环顾四周,发现大多数人似乎都认为while(getchar() != '\n');这会导致我出现问题,因为如果没有换行字符,就会发生不必要的输入扫描.

例:

int ch;
char* buffer = (char*)malloc(BUFSIZ*sizeof(char));
while((ch = getchar()) != '\n' && ch != EOF);
fgets(buffer,BUFSIZ*sizeof(char),stdin);
Run Code Online (Sandbox Code Playgroud)

如果缓冲区不是太小而流中没有尾随字符,则会getchar()导致输入不必要.

输出:

A

A

You typed A

Intended Output:

A

You typed A
Run Code Online (Sandbox Code Playgroud)

我希望我说得够清楚,我感谢任何帮助.

c input flush getchar

2
推荐指数
1
解决办法
504
查看次数

使用getchar()捕获HOME键

我正在为Linux上的控制台程序编写命令行界面.我希望能够使用像箭头一样的键.所以为了捕获代码,我使用这个简单的程序:

int main()
{
    int c = 0;
    while (c != 3) { // ctrl-c
        c = getchar();
        printf("%d\n", c);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做我在捕获HOME键时遇到了问题.在一台计算机上我得到了序列"27 91 72",在另一台计算机上我得到了"27 79 72",在第三台我得到了"27 91 49 126".

我不知道为什么我在HOME和END键上得到如此不同的代码(箭头和F1-F12键在三台计算机上给出了相同的序列).

有没有一种标准的方法来获取这些键,或者某种配置可以在所有机器上提供相同的序列?

linux keyboard terminal getchar

2
推荐指数
1
解决办法
1397
查看次数

是getchar()和putchar()函数还是宏?

我提到了两个可靠的信息来源,两者似乎对同一事物有不同的定义:

http://www.cplusplus.com/reference/clibr%E2%80%A6

http://www.ocf.berkeley.edu/~pad/tigcc/doc/html/stdio_fputchar.html

第一个来源说的putchar()是一个函数,getchar()但是在第二个链接中它表示putchar()是一个宏.我的书说getchar()是一个宏.哪个是对的?

c macros putchar getchar

2
推荐指数
1
解决办法
1342
查看次数

程序在每次输入后打印一个值为10的额外行

我有这个简单的程序:

#include <stdio.h>

int main()
{
    int c;
    while ( ( c = getchar()) != EOF)
        printf("%d %c\n", c, c);

    return 1; 
}
Run Code Online (Sandbox Code Playgroud)

但是由于某些原因,在执行时我最终获得了额外的值10:

a
97 a
10 

b
98 b
10 

abc
97 a
98 b
99 c
10 
Run Code Online (Sandbox Code Playgroud)

什么是价值10,它来自哪里?如何阻止它发生?

解:

#include <stdio.h>
#include <ctype.h>

int main()
{
    int c;
    while ( ( c = getchar()) != EOF)
    {
        if ( isprint (c))
        {
            printf("%d %c\n", c, c);
        }
    }

    return 1; 
}
Run Code Online (Sandbox Code Playgroud)

c printf getchar

2
推荐指数
1
解决办法
110
查看次数

我有两个与getchar()和putchar()有关的问题

#include<stdio.h>

main()
{
char c;
c=getchar();
putchar(c);

c=getchar();
putchar(c);

c=getchar(); 
putchar(c);

c=getchar();
putchar(c);

c=getchar();
putchar(c);

}
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是,每当我们使用getchar()时,它都会在内存中的某个位置创建一个缓冲区,当我们按Enter键时,getchar()开始从缓冲区读取内容,而getchar()一次只能读取一个字符。因此,在上面的程序中,当执行第一个getchar()时,它将在内存中创建一个缓冲区,并且整行内容将存储在缓冲区中,假设当我按下Enter键时我写了“ vik” getchar()开始从缓冲区中读取内容,然后是“ v”将分配给变量c,然后只有'v'将从缓冲区清除,因为getchar()一次仅读取单个字符。然后在下一条语句中,putchar(c)在屏幕上打印“ v”。所以现在“ ik”getchar()语句执行它不会再询问用户写东西,因为除非并且直到缓冲区不会完全刷新,否则它不会再询问用户写东西,而是会从缓冲区读取内容。因此,这里的“ ik”仍然留在黄油中,因此在第二个getchar()语句中,从缓冲区读取“ i”,然后再次从缓冲区中刷新“ i”,putchar(c)打印“ i”。现在'k'在第三个getchar()执行时留在缓冲区中,从缓冲区读取'k'并赋值给c然后'k'也从缓冲区中冲洗掉。此时缓冲区已被完全冲洗掉,缓冲区中没有内容当第四个getchar()将会执行向用户写请求的操作,因为缓冲区中没有内容,所以假设我写“ as”并点击回车。 现在我的主要问题是,当我给两个内容“ as”时,还有两个getchar()和putchar(c)可以执行,那么为什么只有'a'会在屏幕上打印,为什么还没有's'?

而且,我的第二个问题是,如果说使用getchar()时在内存中创建一个缓冲区,那么如果使用fflush(stdin)则必须刷新该缓冲区。所以根据上面程序中的这个,当我在第一个putchar(c)之后而不是冲洗缓冲区之后写fflush(stdin)时,它执行并打印与上面程序相同的输出,为什么?

c putchar getchar

2
推荐指数
1
解决办法
1546
查看次数

getchar()在while循环中的行为

我在终端上运行这个c程序

#include <stdio.h>

int main() {
    int result = 0;

    while(result <= 0) 
    {
        int result = (getchar() != EOF);
        result = 2;
        printf("x");        
    }

    printf("out\n");
}
Run Code Online (Sandbox Code Playgroud)

之后我输入单词"hello",然后返回.结果是我得到了多个'x'字符.

为什么不在第一个'x'之后终止?

c getchar

2
推荐指数
1
解决办法
54
查看次数

标签 统计

getchar ×10

c ×8

eof ×2

putchar ×2

c++ ×1

flush ×1

hex ×1

infinite-loop ×1

input ×1

keyboard ×1

linux ×1

macros ×1

printf ×1

pthreads ×1

terminal ×1