我正在尝试将字符串读入一个char数组,其长度由用户选择。问题是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));
}
这就是讲义说:
使用我们谈到的技术从键盘输入一个字符串(包括空格) about(使用getchar()时,不是gets(),fgets()或scanf()), 增加,以便输入任何数量,但不超过80 字符。输入后确保在正确的位置有空值。
我们在课堂上谈到的技术是将getchar赋值给char数组的while循环。
我的问题: 我的教授对他的指示非常坚定。在这篇讲义中,他特意告诉我输入任何金额,但不超过80.这与getchar的功能相矛盾,对吗?有没有办法限制字符串的长度,使用这种技术'?
在我发现的一些主题上,人们提到它可能与操作系统有关。所以,如果重要的话,我在Windows 8.1上。
答案 0 :(得分:4)
Op的代码很接近。
“getchar()不会停止阅读,直到用户通过按Enter键手动输入换行符”是不正确的
典型的用户输入是行缓冲。在 Enter 发生之前,程序没有任何内容。那时整条线都交给了程序。 getchar()
char
一次stdin
消耗1 int
。
1)需要分配足够的缓冲内存@Grzegorz Szpetkowski
2)将输入读作scanf()
并根据需要读取额外内容
3)不要将char
的值作为要读取的数量返回
4)在读取要读取的getchar()
的数量后读取剩余的行。 @Grzegorz Szpetkowski
unsigned char
会返回EOF
或getchar()
。这通常是257个不同的结果。将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;
}
会失去这种区别。
strlen()
注意:size_t
会返回int
类型,而不是"%zu"
,这可能/您的平台上可能不一样,最好使用正确的格式说明符strlen()
printf("'%s' %d", str, (int) strlen(str));
。或者使用:
{{1}}
答案 1 :(得分:0)
此代码可以在更多地方更正(例如,计算输入的字符,以便您允许用户输入不超过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));
}
答案 2 :(得分:0)
对以上答案的更改很小,尝试此操作不会产生任何“缓冲区已满错误”
#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);
}