1

我想从用户那里获得最大长度为 30 个字符的字符串作为输入,并检查它是否包含行尾。

到目前为止,这是我试图写的:

int main(void) {
int i;
char* command = (char*)calloc(31, sizeof(char));
while (0 < 1) {
    scanf("%s", command);
    for (i = 0; i <= strlen(command); ++i) {
        if (command[i] == '\n')
            printf("here");
    }
    if (strcmp(command, "quit") == 0)
        break;
}

这个想法是检查用户作为输入给出的命令是否“合法” - 即长度 < 31。当我运行此代码时,无论输入的长度如何,它都不会打印“here”。

4

3 回答 3

5

这是因为scanf()不包括换行符,它认为它是空格并使用空格来分隔它转换的值。只需使用strlen()' 的返回值。

于 2012-06-05T16:33:16.923 回答
5

scanf不包括 terminating '\n',但fgets确实:

换行符使 fgets 停止读取,但它被认为是有效字符,因此它包含在复制到 str 的字符串中。

只需将您的scanf行更改为:

fgets(command, 31, stdin);
于 2012-06-05T16:36:43.470 回答
1

使用 fgets(有关更多信息 man fgets)您正在读取的流是标准输入。

它看起来像这样:

fgets(command, 31, stdin);

在字符串的末尾(如果没有错误),您可以查找“\0”。它将被附加到字符串的末尾(这就是为什么我使用 31 而不是 30 作为大小)。

此外,您可以使用 fgets 从任何流(即文件、错误等)中读取数据。我建议您了解它的工作原理,因为它比 scanf 更灵活一点。

希望有帮助。

于 2012-06-05T16:37:59.447 回答