我的C代码:
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
Run Code Online (Sandbox Code Playgroud)
为什么这个程序在输入方面会这样反应hello?
hello
hello
Run Code Online (Sandbox Code Playgroud)
而不是像:
hheelloo
Run Code Online (Sandbox Code Playgroud) 此代码来自K&R.我已经读了好几次了,但似乎仍然无法理解.
#define BUFSIZE 100
char buf[BUFSIZE];
int bufp = 0;
int getch(void)
{
return(bufp>0)?buf[--bufp]:getchar();
}
int ungetch(int c)
{
if(bufp>=BUFSIZE)
printf("too many characters");
else buf[bufp++]=c;
}
Run Code Online (Sandbox Code Playgroud)
K&R说,这两个功能的目的是防止程序读取太多输入.即没有这个代码,一个函数可能无法确定它已经读取了足够的数据而没有先阅读太多.但我不明白它是如何工作的.
例如,考虑getch().据我所知,这是它需要采取的步骤:
我想问一个更具体的问题,但我真的不知道这段代码是如何实现它的目标的,所以我的问题是:(a)目的和(b)这段代码的推理是什么?
提前致谢.
注意:对于任何K&R风扇,此代码可以在第79页找到(根据您的版本,我想)
我正在用C语言编写一个brainfuck解释器,我在使用一些我不习惯的东西时遇到了一些麻烦.在brainfuck中,逗号(,)本质上是getchar().所以我有以下代码:
//This is just ptr
static char *ptr;
switch (command)
{
case ',':
*ptr=getchar(); // Here's the code causing error
break;
}
Run Code Online (Sandbox Code Playgroud)
error: a label can only be part of a statement and a declaration is not a statement当我尝试编译时,gcc会抛向我.
有任何想法吗?(对不起,不太熟悉这个错误)
请在下面找到代码部分.我想在循环中连续打印变量的当前值.一旦我按下转义键,就必须终止循环.这里的问题是执行在getchar函数处停止.但我希望它继续并打印变量的值,直到我点击退出按钮.
do
{
vUpdateVariable(); // routine to update the current value of variable
printf("Value is %f\r", fVariable);
ucKey = getchar();
usleep(1000);
}while (ucKey != 0x1B);
Run Code Online (Sandbox Code Playgroud) 我正在从C编程语言书中运行以下程序:
#include <stdio.h>
main()
{
int c;
while((c=getchar()) != EOF)
putchar();
}
Run Code Online (Sandbox Code Playgroud)
要么
#include<stdio.h>
int main(){
int c = getchar();
while(c != EOF){
putchar(c);
c = getchar();
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,我得到一个无法解释的行为.如果从在下面的序列中的命令行I输入字符:{'h', 'e', 'l', 'l', 'o', '\n', '^D'}然后我得到打印到屏幕以下响应:hello,之后\n被输入,并且该程序退出一旦^D在输入.
但是,当我按如下方式更改序列时:{'h', 'e', 'l', 'l', 'o', '^D'}然后我将以下响应打印到屏幕:hello,但程序不会退出.我进入后不应该退出^D吗?我必须^D第二次进入该计划才能退出.或者程序仅在我输入^D以下内容后退出\n.我不明白为什么不管我何时进入该计划都不会退出^D.有什么想法吗?
我在UNIX系统上运行.
我写了这个简单的练习程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CLASSES 3
#define STUDENTS 4
int grades[CLASSES][STUDENTS];
int main(void)
{
int i = 1;
char t,k;
while(i == 1)
{
printf("\n\n\nMENU:\nEnter the grades(E)\nReport Grades(R)\nQuit(Q)\nYour choice: ");
k = toupper(getchar());
printf("Input entered... %c\n", k);
switch(k) {
case 'E' :
printf("Entering the grades..\n");
break;
case 'R' :
printf("Reporting the grades...\n");
break;
case 'Q' :
printf("Quitting the program...\n");
exit(0);
break;
default:
printf("ERROR: %c: Incorrect menu option\n", k);
break;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它首先要求我输入一个选项.如果我输入'E'或'R',它会进入相应的'case'块,但是在while循环中的下一次迭代中,它不会等我输入我的选择.相反,它假设我输入"NULL"并第三次询问我的提示.每次进入选择时都会发生这种情况.这是该程序的输出.我在这里错过了什么?
host-mb:c_practice …Run Code Online (Sandbox Code Playgroud) 我正在阅读的初学者的C书让我对getchar()和缓冲顺序感到困惑(特别是因为它与换行有关).它说,
摆脱Enter按键是所有C程序员必须面对的问题.考虑以下计划部分:
printf("What are your two initials?\n");
firstInit = getchar();
lastInit = getchar();
Run Code Online (Sandbox Code Playgroud)
你会认为,如果用户输入
GT,那么G它将进入变量firstInit并且T会进入lastInit,但这不会发生.第一个getchar()没有完成,直到用户按Enter键,因为它G是进入缓冲区.只有当用户按下回车键并在G离开该缓冲区,并转到程序,但随后的输入是仍然在缓冲区!因此,第二个getchar()发送Enter(\n)到lastInit.在T仍然留给后续的getchar()(如果有的话).
首先,我不明白作者的解释为什么\n要去lastInit而不是T.我猜是因为我将缓冲区可视化为"先出先出".无论哪种方式,我都不理解作者所呈现的顺序背后的逻辑 - 如果用户输入G,那么T,然后输入,如何被G第一个捕获getchar(),输入(换行)被第二个捕获getchar(),并且在T由第三捕捉getchar()?令人费解.
其次,我自己尝试了这个(Ubuntu 14.04在Windows 8.1下的VMWare上运行,文本编辑器Code :: Blocks,编译器gcc),我得到了作者所说的没有发生的确切常识结果!:G去了firstInit和该T去 …
我在用C语言编写程序时使用getchar()(在课程的这一点上还不允许使用scanf.)我想知道如果它移动到下一个,我是否每次调用它; 包括在任务操作期间.例如; 我试图从控制台读取双倍; 并确定前面是否有负号.如果是的话; 我想将变量neg指定为1(这样我可以判断最终结果是否应该返回负数)然后我想移动到下一个字符来进行实际的双重计算而不是.EX)
int x = getchar();
int neg = 0;
if(x == '-') {
neg = 1;
x = getchar(); // will this make it so the next time I use the x
} // variable it will be past the negative sign and to the
//first actual digit?
Run Code Online (Sandbox Code Playgroud) 我试图将一个字符串读入一个由用户选择的长度的字符数组。问题是 getchar() 不会停止阅读,直到用户根据我的代码按 Enter 手动输入换行符。我已经阅读了其他人的帖子,我明白为什么我不能这样做,这与我的作业讲义完全矛盾。
int chPrompt(int nchars);
void strInput(char str[], int nchars);
int main(void) {
int nchars = chPrompt(nchars);
char str[nchars];
strInput(str, nchars);
return 0;
}
int chPrompt(int nchars) {
printf("How many chars do you need to input? >");
return scanf("%i", &nchars);
}
void strInput(char str[], int nchars) {
int i = 0;
while((str[i] = getchar()) != '\n') {
if(i > nchars-1)
break;
i++;
}
str[i] = '\0';
//Troubleshooting
printf("%s %d", str, strlen(str));
}
Run Code Online (Sandbox Code Playgroud)
这是讲义上的内容:
使用我们讨论过的技术从键盘输入一个字符串(包括空格)(使用 getchar(),而不是 gets() 、 …
我是一名菜鸟,自学使用《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 …