Luk*_*eFi 4 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];
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));
}
Run Code Online (Sandbox Code Playgroud)
这是讲义上的内容:
使用我们讨论过的技术从键盘输入一个字符串(包括空格)(使用 getchar(),而不是 gets() 、 fgets() 或 scanf() ),增强以便它可以输入任何数量,但没有80多个字符。确保在输入后的正确位置有一个空值。
我们在课堂上讨论的技术是将 getchar 赋值给 char 数组的 while 循环。
我的问题:我的教授对他的指示非常坚持。在这个讲义中,他特别告诉我输入最多但不超过 80 的任何数量。这与 getchar 的功能相矛盾,对吗?有没有办法使用这种“技术”来限制字符串的长度?
在我发现的一些线程中,人们提到它可能依赖于操作系统。所以,如果这很重要,我使用的是 Windows 8.1。
Op的代码很接近。
“getchar() 不会停止阅读,直到用户通过按 Enter 手动输入换行符”是不正确的。
典型的用户输入是行缓冲的。在Enter发生之前,什么都不会给程序。那时整行都给了程序。 从 一次getchar()消耗 1char个stdin。
1) 需要分配足够的缓冲内存@Grzegorz Szpetkowski
2) 将输入读取为 anint并根据需要读取额外的内容。
3) 不要返回值scanf()作为要读取的数量。
4) 读完要读的个数后,再读剩余的行char。@Grzegorz Szpetkowski
getchar()返回一个unsigned charor EOF。这通常是 257 个不同的结果。读getchar()入 achar失去了这种区别。
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;
}
Run Code Online (Sandbox Code Playgroud)
注意:strlen()返回 type size_t,而不是int,这在您的平台上可能/可能不同,最好将正确的格式说明符"%zu"与strlen(). 或者使用:
printf("'%s' %d", str, (int) strlen(str));
Run Code Online (Sandbox Code Playgroud)