使用getchar输入字符串
我试图将字符串读入一个字符数组,长度由用户选择。问题是getchar()直到用户根据我的代码按enter键手动输入换行符后才会停止读取。我读过别人的文章,我明白为什么我不能这样做,这与我的作业讲义完全矛盾使用getchar输入字符串,c,string,while-loop,getchar,C,String,While Loop,Getchar,我试图将字符串读入一个字符数组,长度由用户选择。问题是getchar()直到用户根据我的代码按enter键手动输入换行符后才会停止读取。我读过别人的文章,我明白为什么我不能这样做,这与我的作业讲义完全矛盾 int chPrompt(int nchars); void strInput(char str[], int nchars); int main(void) { int nchars = chPrompt(nchars); char str[nchars]; st
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));
}
这是讲义上说的:
使用我们讨论过的技巧从键盘(包括空格)输入字符串
关于(使用getchar()、not gets()、fgets()或scanf()时),
增加,以便输入任何数量,最多不超过80
人物。确保在输入后的正确位置有空值
我们在课堂上讨论的技术是while循环,将getchar赋值给char数组
我的问题:
我的教授对他的指示非常坚决。在这篇讲义中,他特别告诉我输入的任何数量不得超过80。这与getchar的功能相矛盾,对吗?使用这种“技术”有没有办法限制字符串的长度
在我发现的一些线程中,人们提到它可能依赖于操作系统。因此,如果这很重要,我使用的是Windows 8.1。此代码可以在其他几个地方更正(例如,计算输入的字符数,以便允许用户输入不超过80个字符,等等),但这将为您指明正确的方向:
#include <stdio.h>
#include <string.h>
void strInput(char str[], int nchars);
int main(void) {
int nchars = 0;
printf("How many chars do you need to input?\n");
scanf("%d\n", &nchars);
char str[nchars+1];
strInput(str, nchars);
return 0;
}
void chPrompt(int nchars) {
}
void strInput(char str[], int nchars) {
int i = 0;
char c;
while((c = getchar()) != '\n' && i <= (nchars-1)) {
str[i] = c;
i++;
}
str[i] = '\0';
printf("%s %d\n", str, (int)strlen(str));
}
#包括
#包括
虚线输入(字符str[],内部nchars);
内部主(空){
int-nchars=0;
printf(“需要输入多少字符?\n”);
scanf(“%d\n”、&nchars);
字符str[nchars+1];
横纹(str,nchars);
返回0;
}
void chPrompt(int-nchars){
}
虚线输入(字符str[],内部nchars){
int i=0;
字符c;
而((c=getchar())!='\n'和&iOp的代码很接近
“在用户通过按enter键手动输入换行符之前,getchar()不会停止读取”不正确。
典型的用户输入是行缓冲的。在Enter出现之前,不会向程序提供任何内容。此时,整行内容都会提供给程序。getchar()
从stdin
一次消耗1个char
1) 需要分配足够的缓冲内存@Grzegorz Szpetkowski
2) 将输入读取为int
,并根据需要额外读取。
3) 不要将scanf()
中的值作为要读取的数量返回。
4) 在读取要读取的char
的编号后读取剩余的行。@Grzegorz Szpetkowski
getchar()
返回一个unsigned char
或EOF
。这通常是257个不同的结果。将getchar()
读入一个char
将失去这种区别
void strInput(char str[], int nchars) {
int i = 0;
int ch;
while((ch = getchar()) != '\n' && ch != EOF ) {
if (i < nchars) {
str[i++] = ch;
}
}
str[i] = '\0';
}
int main(void) {
int nchars = chPrompt(nchars);
char str[nchars + 1]; // + 1
strInput(str, nchars);
//Troubleshooting
printf("'%s' %zu", str, strlen(str));
return 0;
}
int chPrompt(int nchars) {
printf("How many chars do you need to input? >");
if (scanf("%i", &nchars) != 1) {
printf("Unable to read #\n");
exit(-1);
}
// Consume remaining text in the line
int ch;
while((ch = getchar()) != '\n' && ch != EOF );
return nchars;
}
上面的答案没有什么变化,试试看,它不会给出任何“缓冲区已满错误”
#包括
#包括
void getinput(字符str1[],int s){
int i=0;
printf(“内部fn\n”);
字符c;
while((c=getchar())!=EOF&&icharstr[nchars];
→ char str[nchars+1];
。您遗漏了空字符的空格。您所指的是“缓冲输入模式”。@grzegorzzpetkowski已处理完毕!感谢提醒。有没有办法绕过缓冲输入模式?或者我误解了讲义?“这与getchar的功能相矛盾,对吗?”--不,不正确。你似乎把getchar和fgets混在一起了。我不清楚你的教授在要求什么。如果他想从字面上理解“最多,但不超过80个字符”,那么就没有更多的字符可以是“身体上的”在控制台中键入,则无法在C中以可移植的方式执行。@GrzegorzSzpetkowski如果是这样的话,那么我相信这已经解决了:)谢谢。我应用了更改,但出于某种原因,程序在nchars提示后立即退出。唯一的输出是我用于故障排除的printf语句。它在没有其他操作时退出。请随意更改。好的,我认为它现在符合讲义上的标准。它将指定数量读取到string,但getchar仍在填充缓冲区,直到用户按enter键手动输入换行符。没有办法吗?感谢您的帮助:)出于某种原因,在输入nchars后,它输出我正在进行故障排除的printf,然后退出程序。我使用ctrl+z恢复到原始代码,现在我的代码正在运行g一样。不太确定出了什么问题:S@LukeFi:请注意,scanf()
调用会在stdin
中留下“孤立的”'\n'
字符。使用while(getchar()!='\n');
(为了清晰起见,您可以在单独的行中加上分号和缩进)来去除它。组合scanf()并不难
即将推出的getchar()
@LukeFi Grzegorz Szpetkowski是正确的。根据您的帖子,您似乎可以将长度80硬编码到代码中,而不是查询它。@LukeFi或者在读取数字后,int ch;while((ch=getchar())!='\n'&ch!=EOF);
清除chPrompt()
@GrzegorzSzpetkowski中剩余的char
字符数小时以来,我一直为stdin中的那条新行感到头疼!不知道它是scanf留下的。我一直认为scanf之后的新行只是一个输出。谢谢。
printf("'%s' %d", str, (int) strlen(str));
#include<stdio.h>
#include<string.h>
void getinput(char str1[],int s){
int i=0;
printf("inside fn\n");
char c;
while((c=getchar())!=EOF && i<=(s-1))
{ str1[i++]=c;
}
str1[i]='\0';}
void main()
{ int size;
printf("enter the no. of characters \n");
scanf("%d", &size);
char str1[size+1];
getinput(str1,size);
printf("%s \n",str1);
}