我有一个可以进行大量处理的小程序。您可以通过按 Enter 键来打印进度。
我实现这一点的方法是在主线程中完成处理,同时我有一个 pthread 不断在 getchar() 上循环以等待输入键。
问题是当我完成处理时。发生这种情况时,主线程完成,但仍然等待按下 Enter 键,因为 getchar() 正在阻塞。
如何“取消”getchar()?
#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 完全阻止读取其后的任何内容?
对于我的家庭作业,我需要实现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()正确终止.
我在我的代码中遍历来自stdin的十六进制输入,我注意到当达到0xff字节时,我无法绕过我的代码.我知道这是因为循环是:
while( (c=getchar()) != EOF)
Run Code Online (Sandbox Code Playgroud)
但是,我不能把它排除在外,因为否则在真正的End-Of-File之后调用getchar并且它会出现段错误.如何正确遍历完整输入?
(对不起,我知道这个看似常见的任务应该有一个简单的答案,但我试着搜索了一段时间但什么都没发现)
我是一名软件工程专业的学生,我正在休假,为了在下学期学习更好,我一直在编写各种控制台应用程序来练习.但是我遇到了一个问题,我需要从用户那里得到整数输入.我一直在使用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)
我希望我说得够清楚,我感谢任何帮助.
我正在为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键在三台计算机上给出了相同的序列).
有没有一种标准的方法来获取这些键,或者某种配置可以在所有机器上提供相同的序列?
我提到了两个可靠的信息来源,两者似乎对同一事物有不同的定义:
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()是一个宏.哪个是对的?
我有这个简单的程序:
#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) #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程序
#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'之后终止?