c语言中puts()函数的问题

为什么s1和s2都不能用puts()输出?


#include
int main()
{
    char *s1;scanf("%s",s1);
    puts(s1);
    char *s2[5]={"ABCDE"};
    puts(s2);
}
//第一个指针本身只是个变量是用来指向地址的,用字符串去赋值是用法错误!
//第二个相当于二维数组,是指针数组,你的输出格式有误!应该s2[0]

#include<stdio.h>
int main()
{
    char s1[128];
    scanf("%s",s1);
    puts(s1);
    char *s2="ABCDE";
    puts(s2);
}

参考GPT和自己的思路:在代码中,字符指针变量s1和字符指针数组s2都没有被初始化,所以当试图向它们写入字符串时会发生未定义的行为。其中,s1只是声明了一个指针变量,但没有分配内存来存储字符串,因此在使用puts函数输出s1时会出现不可预测的结果。s2声明为字符指针数组,但是初始化的时候只给了一个字符串,其它四个指针没有初始化,仍然是不知道其指向的内存位置,也会导致不可预测的行为。如果要让s1和s2都能够用puts函数输出,需要为它们分配足够的内存,并且进行初始化。例如:

#include<stdio.h>
int main()
{
    char s1[100]; scanf("%s",s1);
    puts(s1);
    char s2[5][6]={"ABCDE"}; //每个字符串长度为6,多出一位用于存放'\0'
    puts(s2[0]);
}

需要注意的是,当使用puts函数输出字符指针数组时,只能输出数组中的第一个元素,因为数组名代表数组首元素的地址,而puts函数只能接收字符指针类型的参数。

没有字符串结尾标志'\0'

char *s1; 这里定义的 s1只是一个指针的大小,输入scanf("%s",s1); 字符串时没有存储的空间。
char *s2[5]={"ABCDE"}; 定义的是指针数组 s2,共有5个元素,这里只初始化了第一个元素即s2[0] = "ABCDE" ,所以puts(s2[0]); 才是正确的。

不知道你这个问题是否已经解决, 如果还没有解决的话:

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