有没有办法找到空格元素(ASCII:32)字符串之间的C

ddrv8njm  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(75)

我正在学习scanf()如何在C中使用缓冲区。
下面是我的代码:

#include <stdio.h>

int main(void) {
    char str[80];

    scanf("%s", str);
    printf("1st word: %s\n", str);
    scanf("%s", str);
    printf("2nd word: %s\n", str);
    scanf("%c", &str[0]);
    printf("buffer: %d\n", str[0]);
    return 0;
}

字符串
我输入apple jam作为输入。我认为第三个scanf将占用缓冲区中的空间(' ')。但结果却不一样。它接受了'\n',buffer中的换行符。
我以为结果会是这样的:

1st word: apple
2nd word: jam
buffer: 32


但结果是

1st word: apple
2nd word: jam
buffer: 10


由于第一个scanf("%s", str);从缓冲区中取出字apple,第二个scanf("%s", str);从缓冲区中取出字jam,因此我认为缓冲区仍然包含' ''\n'
所以我预计结果会是buffer: 32。但是,第三个scanfscanf("%c", &str[0]);)从缓冲区中获取换行符。
在哪里可以找到空格字符(' ')?

6tdlim6h

6tdlim6h1#

scanf("%s", str);从标准输入中读取并丢弃任何空白字符(这会导致从终端请求输入,并且您的输入被读取为一整行,开头没有任何空白字符),然后将任何非空白字符读取到目标数组str中。使用您的输入,您在str中得到applescanf()返回1成功转换,printf("1st word: %s\n", str);输出1st word: apple和一个换行符。
下一个调用scanf("%s", str);做同样的事情,所以你输入的空格只是被读取和丢弃,str接收jamscanf()返回1成功转换,printf("2nd word: %s\n", str);输出2nd word: jam和一个换行符。
下一个scanf("%c", &str[0]);读取当你在apple jam之后按回车键时输入的换行符,并将其存储到str[0]中,这个换行符在你的系统上的值为10,大概是使用ASCII。scanf()返回1,结果printf("buffer: %d\n", str[0]);输出10
请注意,您应该编写scanf("%99s", str)以避免超长输入的未定义行为,并且应该测试scanf的返回值以检测无效或丢失的输入。

相关问题