gpt4 book ai didi

c - 使用getchar输入字符串

转载 作者:太空狗 更新时间:2023-10-29 15:32:36 26 4
gpt4 key购买 nike

我正在尝试将一个字符串读入一个长度由用户选择的字符数组。问题是 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 charEOF。这通常是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com