我正在编写一个程序,它应该读取两个可以包含换行符和其他各种字符的字符串.因此,我使用EOF(Ctrl-Z或Ctrl-D)结束字符串.
这适用于第一个变量,但是使用第二个变量,然而,这似乎是有问题的,因为显然某些东西卡在输入缓冲区中并且用户无法输入任何内容.
我尝试用while (getchar() != '\n');几种类似的变化来清理缓冲区,但似乎没有任何帮助.所有清洁尝试都导致无限循环,如果不进行清洁,则无法添加第二个变量.
两个变量的字符都在这样的循环中读取:while((c = getchar()) != EOF)这表明它是我在缓冲区中停留的EOF.或者以其他方式影响程序的行为?我正在使用的逻辑有什么问题吗?
经过几个小时的挣扎,我开始有点绝望了.
[编辑:下面添加代码]
[编辑2:clearerr()似乎使这个EOF解决方案毕竟有效.
它似乎以我在Linux下的原始形式运行,我昨天在Windows上试用它.
码:
#include <stdio.h>
#include <string.h>
int main(void)
{
int x = 0;
int c;
char a[100];
char b[100];
printf("Enter a: ");
while((c = getchar()) != EOF)
{
a[x] = c;
x++;
}
a[x] = '\0';
x = 0;
/*while (getchar() != '\n'); - the non-working loop*/
printf("\nEnter b: ");
while((c = getchar()) != EOF)
{
b[x] = c;
x++;
}
b[x] …Run Code Online (Sandbox Code Playgroud) 我是一名C n00b,试图在K&R上自学C语言.我的问题有点令人尴尬的基本问题.好的,这里说:我无法使用getchar获取程序,以提供我期望的那种输出.如果你碰巧有K&R,我会坚持练习1.13.问题是,"编写一个程序来打印输入中单词长度的直方图."我甚至无法处理水平版本,因为我遇到了这个问题.
我在XP上使用Dev-C++(mingW编译器)并在命令行下运行程序.我的问题是,当我尝试运行我的程序,它等待我进入字符从扫描,但是当我做输入并按下回车键,它不会做任何事情.我希望它继续按照我的预期打印直方图.实际上,它似乎甚至没有计算字长,因为你可以在代码中看到,当我尝试打印ctr数组中的内容只是为了看它是否包含任何东西时,什么都没有打印出来.
我是如此n00b,我不知道这是我的代码或命令行是否有问题.但我怀疑它与系统有关,因为当我尝试编译并运行模型程序时,同样的事情发生了.输入输入,按Enter键,没有任何反应.如果我是Ctrl-C,有时会吐出一个星号或两个看起来与模型输出完全不同的星号.其他时候,它没有做任何事情(只是回到提示).
这是我练习的代码.我花了一整天的时间来质疑我继续编程的能力.如果有人能让我走出这个洞,我真的非常感激!
另外,我还有一个关于我上面提到的模型程序的问题,但我想我应该在自己的问题中发布它.谢谢大家:)
#include <stdio.h>
//#define 1 IN
//#define 0 OUT
int main () {
//start w/ state = OUT
int c = 0;
// int state = OUT;
int len = 0;
int ctr[12];
int i, j;
i = j = 0;
for (i = 0; i <12; i++)
ctr[i] = 0;
while ((c = getchar()) != EOF)
if (c != ' ' && c != '\t' && c != '\n') { …Run Code Online (Sandbox Code Playgroud) 我一直在寻找解决我问题的方法很长一段时间,这就是我转向你的原因:
考虑一下这段代码:
static char done = 0;
static void sigHandler(void)
{
done = 1;
}
int user_input()
{
return (getchar() == 'q') ? 0 : 1;
}
int main(void)
{
signal(SIGTERM, sigHandler);
signal(SIGINT, sigHandler);
while (user_input() != 0 && !done)
usleep(1000);
printf("exiting\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预期行为:当用户输入q然后输入时,程序退出.如果按下CTRL+ C,则由sigHandler函数捕获它,该函数将标志'done'设置为1并退出程序.
观察到的行为:getchar()调用会使用CTRL+ C字符,并且永远不会执行sigHandler函数.当CTRL+ C,然后按Enter键,则sigHandler函数被调用,程序退出.
有经验和知识的人可以帮助我吗?
感谢您的输入 :)
我对使用getchar()从用户读取字符输入有疑问.
char char1, char2;
char1 = getchar();
char2 = getchar();
Run Code Online (Sandbox Code Playgroud)
我需要将2chars作为用户的输入.在这种情况下,如果用户输入'A'后跟a newline的字符'B',然后输入字符,将存储的内容char2- 是换行字符还是字符'B'?
我在Windows上的CodeBlocks上尝试过它,并且char2实际上存储了换行符,但我打算用它来存储该字符'B'.
我只是想知道预期的行为是什么,以及它是否依赖于编译器?如果是这样,turbo C和mingW之间有什么区别?
我刚刚开始编程c,我正在通过Brian W.Kernighan和Dennis M.Richie的C编程语言工作.
第一个示例之一是字符计数,并给出了以下程序,但是当我输入字符串时,没有打印结果.
#include <stdio.h>
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n",nc);
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
我面对的是一些我无法解释的事情.除了举例外,没有更好的解释方式:
#include <stdio.h>
int main ()
{
char c;
while (1) {
c = getchar();
printf("%x\n", c);
}
return(0);
}
Run Code Online (Sandbox Code Playgroud)
如果我执行此命令,它只是以这种方式无限迭代:
$ echo -n "A" | ./binary
41
ffffffff
ffffffff
ffffffff
ffffffff
...
Run Code Online (Sandbox Code Playgroud)
从我所知道的和我读(混乱有关的getchar()循环内部是如何工作),我以为echo -n "A"会发A到标准输入,然后触发EOF 事件(我不知道什么EOF真的是)一次,因此我的循环最多迭代两次,然后等待stdin中的新输入.
但不,它迭代EOF,我不明白为什么.
我运行此命令试图理解:
$ echo -n "A" | strace ./binary
read(0, "A", 4096) = 1
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7ff6000
write(1, …Run Code Online (Sandbox Code Playgroud) 我是一名菜鸟,自学使用《C 编程语言》第二版(K&R编写)进行 C 语言编程。在第 1 章第1.5.1 节文件复制中,作者非常简要地介绍了在值之间进行比较时的操作优先级,强调了使用括号的重要性,在本例中,以确保在比较之前对变量“c”进行赋值被评估。他们断言:
c = getchar() != EOF
Run Code Online (Sandbox Code Playgroud)
相当于
c = (getchar() != EOF)
Run Code Online (Sandbox Code Playgroud)
其中“设置为 0 或 1 会产生不良影响c,具体取决于 getchar 的调用是否遇到文件结尾”
然后作者提出练习 1-6 - 验证表达式getchar () != EOF是 0 或 1
根据作者之前的断言,这看起来几乎微不足道,所以我创建了以下代码:
#include <stdio.h>
main()
{
int c;
while (c = (getchar() != EOF))
putchar(c);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我运行该程序时,如果遇到 EOF,它只会输出我在命令窗口中键入的任何字符,而不是预期的 1 或 0 字符串。
虽然我是一个菜鸟,但我认为我明白了作者试图教授的逻辑,但我无法演示这个简单的任务。在这种情况下,变量不应该c采用比较表达式求值的值,而不是恰好getchar()获取的任何字符,特别是因为括号的位置?如果c确实采用比较的值,则putchar()应该只输出 0 或 1,但按照公式,它会输出我在命令窗口中键入的内容。我究竟做错了什么?我不明白什么?难道是我的编译器的问题?我正在 x64 …
这是我大学去年第一次“编程入门”考试中的一个问题:
使用该
getchar()函数读取由数字、+ 和 - 符号组成的输入序列。输出应该是那些算术运算的结果。
例如,如果输入是10+13-12+25-5+100,则输出应该是131。
现在,鉴于我在参加大学之前有一点 C 经验,使用指针、数组等似乎很容易解决这个问题。
但这里有一个问题:在考试中,你只能使用学生目前学到的东西。鉴于此考试仅在学年开始后一个月,您的选择相当有限。
您只能使用变量、基本输入/输出内容、运算符(逻辑和按位)、条件语句和循环、函数。
这意味着不:数组、字符串、指针、递归、结构或任何其他使这变得容易的东西。
我他妈的怎么做?今天是我第二次花了 3 个小时试图解决这个问题。我已经成功解决了它,但只有在“作弊”并使用数组、字符串函数 ( strtol) 和指针之后。知道如何通过规则解决它对我来说很重要,因为我将在即将到来的考试中遇到类似的问题。
编辑:到目前为止,我的尝试都是将 while 循环与getchar()for 输入结合使用,之后我就卡住了。如果不使用更多“工具”,我对我应该做什么没有丝毫的想法。
我有一个可以进行大量处理的小程序。您可以通过按 Enter 键来打印进度。
我实现这一点的方法是在主线程中完成处理,同时我有一个 pthread 不断在 getchar() 上循环以等待输入键。
问题是当我完成处理时。发生这种情况时,主线程完成,但仍然等待按下 Enter 键,因为 getchar() 正在阻塞。
如何“取消”getchar()?
从我之前的帖子中,我发现getchar()只有在按Enter键时才会完成.我们考虑一下这段代码:
#include<stdio.h>
main()
{
getchar();
getchar();
getchar();
getchar();
getchar();
}
Run Code Online (Sandbox Code Playgroud)
我希望它能像这样运行:我按下某个键1,然后按Enter键,然后按键2键,然后按键3键,然后按键4键,然后按键4键,输入键,最后按键5键,输入,程序应立即终止.这不是实际发生的事情.会发生什么:我按下某个键1然后按Enter键,然后按键2键,输入键,然后按键3键,输入,程序最终终止!
- 为什么最后两个getchar()不起作用?
我观察到的另一个奇怪的事情是,如果我这样做:key1,key2,key3,key4 + Enter然后程序终止.例如,如果我连续按q,w,e和r然后按Enter键,程序将终止.
- 为什么不是所有的getchar()都要求输入?这是否意味着getchar()将任何其他键作为Enter?但接下来的密钥是否作为下一个getchar()的输入?
让我们考虑另一个代码:
#include<stdio.h>
main()
{
int c=getchar();
int d=getchar();
int e=getchar();
printf("2 getchar are remaining\n");
int f=getchar();
int g=getchar();
printf(" c is %d, d is %d, e is %d, f is %d and g is %d",c,d,e,f,g);
}
Run Code Online (Sandbox Code Playgroud)
我输入:ABCDEFG然后输入.当我按下C或D时,应该打印第2行getchar.但它最后打印,意味着所有getchar()s同时执行 - 这很奇怪.
- 程序是否逐行执行?即在第三个getchar之后,printf()应该可以工作.但是当所有的getchar()都被执行时它终于工作了.