使用getchar循环用户输入

时间:2015-06-19 13:33:39

标签: c user-interface loops getchar

我编写了一个小脚本,用C中的getchar()函数检测用户输入的完整值。由于getchar()只返回我尝试循环的第一个字符...我自己试过的代码是:

#include <stdio.h>

int main()
{
    char a = getchar();
    int b = strlen(a);

    for(i=0; i<b; i++) {
        printf("%c", a[i]);
    }
    return 0;
}

但是这段代码并没有给我完整的用户输入值。

5 个答案:

答案 0 :(得分:5)

你可以这样循环部分

int c;
while((c = getchar()) != '\n' && c != EOF)
{
    printf("%c", c);
}

答案 1 :(得分:3)

getchar()返回int,而不是char。并且它每次迭代只返回一个char。一旦输入终止,它就会返回EOF

您没有检查EOF(当getchar()char时,您实际上无法立即检测到它。

a是char,不是数组,也不是字符串,您不能将strlen()应用于它。

strlen()会返回size_t,这是无符号的。

启用大多数警告,编译器希望为您提供帮助。

旁注:char可以是签名或未签名。

阅读C书!您的代码太破碎了,您混淆了多个基本概念。 - 没有冒犯!

对于初学者,试试这个:

#include <stdio.h>

int main(void)
{
    int ch;

    while ( 1 ) {

        ch = getchar();
    x:  if ( ch == EOF )     // done if input terminated
            break;

        printf("%c", ch);    // %c takes an int-argument!
    }

    return 0;
}

如果您想终止其他字符串#include <string.h>并将行x:替换为:

if ( ch == EOF || strchr("\n\r\33", ch) )

如果ch是字符串文字中列出的字符之一(此处为:newline,return,ESCape),则会终止。但是,它也会匹配终止'\0'(不确定你是否可以输入)。

将它存储到一个数组中会出现在好的C书中(至少你会学会如何自己做)。

答案 2 :(得分:1)

  • 第1点:在您的代码中,a不属于数组类型。你不能在那上使用数组下标运算符。

  • 第2点:在您的代码中,strlen(a);是错误的。 strlen()计算字符串的长度,即空终止char数组。您需要将指向字符串的指针传递给strlen()

  • 第3点: getchar()不会自行循环。您需要将getchar()置于循环内以继续读取输入。

  • 第4点: getchar()重新投放int。您应该相应地更改变量类型。

  • 第5点main()的推荐签名为int main(void)

记住以上几点,我们可以编写一个pesudo代码,它看起来像

#include <stdio.h>
#define MAX 10

int main(void)                        // nice signature. :-)
{
    char arr[MAX]  = {0};            //to store the input
    int ret = 0;

    for(int i=0; i<MAX; i++)      //don't want to overrrun array
    {
      if ( (ret = getchar())!= EOF)  //yes, getchar() returns int
      {
            arr[i] = ret;
            printf("%c", arr[i]);
      }
      else
           ;//error handling
    }
    return 0;
}

请参阅此处 LIVE DEMO

答案 3 :(得分:0)

getchar():获取一个char(一个字符)而不是你想要的字符串

使用fgets():获取字符串或gets()(不推荐)或scanf()(不推荐)

但首先需要分配字符串的大小:char S[50] 或使用malloc#include<stdlib.h>):

char *S;
S=(char*)malloc(50);

答案 4 :(得分:0)

看起来你想读一行(你的问题提到了一个“完整的价值”,但你没有解释这意味着什么)。

您可能只是为了这个目的而使用fgets,并且必须提供固定大小的行缓冲区(并且处理 - 或忽略 - 当行大于缓冲区时的情况)。所以你要编码

char linebuf[80];
memset (linebuf, 0, sizeof(linbuf)); // clear the buffer
char* lp = fgets(linebuf, sizeof(linebuf), stdin);
if (!lp) { 
  // handle end-of-file or error
}
else if (!strchr(lp, '\n')) {
  /// too short linebuf
}

如果您使用的是POSIX系统(例如Linux或MacOSX),则可以使用getline(动态分配缓冲区)。如果您想在Linux上使用某些行编辑工具,请同时考虑readline(3)

避免瘟疫过时gets

一旦你在某个缓冲区中读取了一行,你就可以解析它(例如使用手动解析,或sscanf - 注意有用的%n转换规范,并测试{{1的结果计数}},或strtol(3) - 注意它可以给你结束指针等等......)。