c语言字符数组的输入输出问题

大家看一看,为什么洛谷评测下的两种输出方式结果不一样,是不是有什么问题忽略了?

img

img

img

img

img

第一种写法应该是没有字符串结束标志,第二种写法有循环结束标志,所以不会在字符后面打印其他的字符。在内存中未初始化的字符数组中存放的东西如下图所示:

img

【以下回答由 GPT 生成】

问题的根源在于scanf函数和gets函数对于字符串数组输入的不同处理方式。scanf函数在读取字符串时,会遇到空白字符(空格、制表符、换行符等)即停止读取,而gets函数会一直读取字符,直到遇到换行符为止。因此,scanf函数只能读取不带空格的字符串,而gets函数可以读取包含空格的整行字符串。

要解决这个问题,可以根据实际需求选择合适的输入函数。

下面是修改后的代码:

#include <stdio.h>

int main() {
    char str[100];
    scanf("%[^\n]", str);   // 使用 %[^\n] 格式控制符读取整行字符串,直到遇到换行符为止(不包含换行符)
    printf("%s\n", str);
    return 0;
}

使用%[^\n]格式控制符代替%s,可以读取整行字符串,直到遇到换行符为止(不包含换行符)。

如果希望使用gets函数进行输入,可以将示例代码2中的gets函数替换为fgets函数。fgets函数可以指定最大读取字符数,遇到换行符或读取字符数达到最大值时停止读取。

#include <stdio.h>

int main() {
    char str[100];
    fgets(str, sizeof(str), stdin);   // 使用 fgets 函数读取整行字符串,最大读取 sizeof(str)-1 个字符
    printf("%s", str);
    return 0;
}

使用fgets函数代替gets函数,在第二个参数中指定最大读取字符数为sizeof(str)-1,这是为了防止溢出,最后一个字符保留给字符串的结束符\0



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^