标签: getchar

getchar和putchar

我的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)

c getchar

5
推荐指数
2
解决办法
2164
查看次数

请解释此示例C代码

此代码来自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().据我所知,这是它需要采取的步骤:

  1. 检查bufp是否大于0.
  2. 如果是,则返回buf [ - bufp]的char值.
  3. else返回getchar().

我想问一个更具体的问题,但我真的不知道这段代码是如何实现它的目标的,所以我的问题是:(a)目的和(b)这段代码的推理是什么?

提前致谢.

注意:对于任何K&R风扇,此代码可以在第79页找到(根据您的版本,我想)

c buffer kernighan-and-ritchie getchar

5
推荐指数
1
解决办法
1707
查看次数

错误:标签只能是声明的一部分

我正在用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会抛向我.

有任何想法吗?(对不起,不太熟悉这个错误)

c gcc pointers compiler-errors getchar

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

如何在循环中连续打印变量,并在Linux下用C命中一个转义键终止?

请在下面找到代码部分.我想在循环中连续打印变量的当前值.一旦我按下转义键,就必须终止循环.这里的问题是执行在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 linux loops nonblocking getchar

5
推荐指数
1
解决办法
394
查看次数

getchar()!= EOF

我正在从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系统上运行.

c putchar getchar

5
推荐指数
1
解决办法
715
查看次数

为什么这个语句在while循环中打印两次?

我写了这个简单的练习程序:

#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 io loops while-loop getchar

5
推荐指数
1
解决办法
4683
查看次数

getchar()和缓冲区顺序

我正在阅读的初学者的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

5
推荐指数
1
解决办法
262
查看次数

在C中使用getchar(); 每次使用它都会移动到下一个字符吗?包括在任务操作中?

我在用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)

c getchar

5
推荐指数
1
解决办法
726
查看次数

使用 getchar 输入字符串

我试图将一个字符串读入一个由用户选择的长度的字符数组。问题是 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 string while-loop getchar

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

C、K&amp;R 练习 1-6,卡住,困惑

我是一名菜鸟,自学使用《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 …

c putchar getchar

4
推荐指数
1
解决办法
1077
查看次数