我编写了一个小脚本,用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;
}
但是这段代码并没有给我完整的用户输入值。
答案 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) - 注意它可以给你结束指针等等......)。