-1

为一些家庭作业和我的生活而苦苦挣扎,我无法弄清楚这一点。伪逻辑将是

 printf("Enter a string\n");

然后运行循环检查字符串是否超过 10 个字符,如果没有重新提示输入小于 10 个字符的字符串。

4

2 回答 2

1

请就您的问题提出具体问题,并向我们提供您迄今为止的尝试。否则,我们将不得不对您对 C 的理解做出假设,而这样的假设可能看起来令人反感。

不能期望用户使用键盘输入“\0”字符,因此“字符串”可能来自标准输入的想法似乎很愚蠢。在用户按下这个 '\0' 键之前,你必须读取多少字节?最多十个。编写一个以 while 开始x = 0;并继续的循环x < 10。循环应该在getchar() == '\0'. 在循环之外,测试 x。如果 x 达到 10,则循环在输入 '\0' 之前结束;提示用户输入新字符串。

也许您的老师希望您使用其他字符作为终端字符,并将结果存储到数组中(在这种情况下,输入实际上不是字符串,因为 '\0' 与结尾无关)。编写完上述程序后,就可以对其进行调整。

于 2013-02-17T04:16:35.437 回答
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()。它更复杂,并没有提供任何明显的好处。

于 2013-02-17T05:00:48.273 回答