我正在尝试将一个字符串读入一个长度由用户选择的字符数组。问题是 getchar() 不会停止读取,直到用户根据我的代码按回车键手动输入换行符。我已经阅读了其他人的帖子,并且我明白为什么我不能这样做,这与我的作业讲义完全矛盾。
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(),而不是 gets()、fgets() 或 scanf()), 扩充以便它可以输入最多但不超过 80 的任何数量 人物。确保在输入后的适当位置有一个空值。
我们在类里面讨论的技术是将 getchar 赋值给 char 数组的 while 循环。
我的问题: 我的教授非常坚持他的指示。在这份讲义中,他特别告诉我输入最多但不超过 80 的任意数量。这与 getchar 的功能相矛盾,对吗?有什么方法可以使用这种“技术”来限制字符串的长度吗?
在我发现的一些线程中,人们提到它可能取决于操作系统。所以,如果这很重要,我使用的是 Windows 8.1。
最佳答案
Op 的代码很接近。
“getchar() 不会停止读取,直到用户通过按 enter 手动输入换行符”是不正确的。
典型的用户输入是行缓冲。在 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;
}
注意:strlen()
返回类型size_t
,而不是int
,这在你的平台上可能/可能不一样,最好使用正确的格式说明符 "%zu"
和 strlen()
。或者使用:
printf("'%s' %d", str, (int) strlen(str));
关于c - 使用getchar输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963664/