为一些家庭作业和我的生活而苦苦挣扎,我无法弄清楚这一点。伪逻辑将是
printf("Enter a string\n");
然后运行循环检查字符串是否超过 10 个字符,如果没有重新提示输入小于 10 个字符的字符串。
请就您的问题提出具体问题,并向我们提供您迄今为止的尝试。否则,我们将不得不对您对 C 的理解做出假设,而这样的假设可能看起来令人反感。
不能期望用户使用键盘输入“\0”字符,因此“字符串”可能来自标准输入的想法似乎很愚蠢。在用户按下这个 '\0' 键之前,你必须读取多少字节?最多十个。编写一个以 while 开始x = 0;
并继续的循环x < 10
。循环应该在getchar() == '\0'
. 在循环之外,测试 x。如果 x 达到 10,则循环在输入 '\0' 之前结束;提示用户输入新字符串。
也许您的老师希望您使用其他字符作为终端字符,并将结果存储到数组中(在这种情况下,输入实际上不是字符串,因为 '\0' 与结尾无关)。编写完上述程序后,就可以对其进行调整。
有多种方法可以做到这一点,具体取决于总体目标。
char input[11];
if (scanf("%10s", input) != 1)
...error...
...here, the string is not longer than 10 characters, and contains no white space...
如果您决定让他们输入更多字符然后抱怨,或者如果您需要他们能够输入空格,那么:
char input[4096];
while (1)
{
printf("Enter a string\n");
if (fgets(input, sizeof(input), stdin) == 0)
break; // EOF or error
size_t len = strlen(input);
if (len > 0)
input[--len] = '\0'; // Zap newline
if (len <= 10)
break;
}
这会循环提示、读取、截断、验证。您可能需要考虑在退出循环时如何区分 EOF 或错误和有效输入。如果代码实际上位于传递缓冲区以用于输入的函数中,则最容易做到这一点:
int prompt_for_string(const char *prompt, char *buffer, size_t buflen)
{
while (1)
{
printf("%s", prompt);
if (fgets(buffer, buflen, stdin) == 0)
return EOF;
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n')
buffer[--len] = '\0';
if (len <= 10)
return len;
}
return EOF;
}
如果你真的下定了决心,你可以编写一个输入循环,用getchar()
or 的一个亲戚代替fgets()
or scanf()
。它更复杂,并没有提供任何明显的好处。