为什么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]); 才是正确的。
我花了好几个小时,一大部分在查C语言库提供了哪些可以解决这个问题的函数,刚刚开始使用的是<string.h>中的strstr(s,s1):返回NULL或者s1在s中首次出现的地址,注意这是一个地址(char*),然后一串乱搞,没搞成。
后来翻来这本书,仔细研究了strcmp(s1,s2)和
strcpy(s1,s2),strncpy(s1,s2,n)这三个函数以后,让我天灵盖一通。