Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scanf()在将字符串声明为char string[]时起作用,但在将其声明为char时不起作用* #包括 #包括 int main() { 字符t1string[20]; scanf(“%s”,t1string); printf(“%s\n”,t1string); printf(“%c\n”,t1string[4]); char*t2字符串; scanf(“%s”,t2字符串); printf(“%s\n”,t2string); printf(“%c”,t2string[4]); }_C_Scanf - Fatal编程技术网

Scanf()在将字符串声明为char string[]时起作用,但在将其声明为char时不起作用* #包括 #包括 int main() { 字符t1string[20]; scanf(“%s”,t1string); printf(“%s\n”,t1string); printf(“%c\n”,t1string[4]); char*t2字符串; scanf(“%s”,t2字符串); printf(“%s\n”,t2string); printf(“%c”,t2string[4]); }

Scanf()在将字符串声明为char string[]时起作用,但在将其声明为char时不起作用* #包括 #包括 int main() { 字符t1string[20]; scanf(“%s”,t1string); printf(“%s\n”,t1string); printf(“%c\n”,t1string[4]); char*t2字符串; scanf(“%s”,t2字符串); printf(“%s\n”,t2string); printf(“%c”,t2string[4]); },c,scanf,C,Scanf,为什么scanf()在第二种情况下(字符串声明为char*)不起作用?因为在调用scanf函数之前,相应的空间没有分配给“t2string”,也就是说,“t2string”的指针没有指向某个地址 t2string=(char*)malloc(20*sizeof(char)); //或 字符t1string[20]; t2string=t1string; 因为char[]和char*是不同的 字符数组或char[]是编译器在堆栈中分配的数据块。内存在初始化时分配,并由编译器自动完成。它的位置或大小

为什么scanf()在第二种情况下(字符串声明为char*)不起作用?

因为在调用scanf函数之前,相应的空间没有分配给“t2string”,也就是说,“t2string”的指针没有指向某个地址

t2string=(char*)malloc(20*sizeof(char));
//或
字符t1string[20];
t2string=t1string;

因为
char[]
char*
是不同的

字符数组或
char[]
是编译器在堆栈中分配的数据块。内存在初始化时分配,并由编译器自动完成。它的位置或大小一旦分配就不能更改,因为它是由编译器管理的

所以

当编译器给它分配空间时工作

另一方面,
char*
只是用于将内存地址存储到另一个块的一个变量。它所做的只是初始化内存以存储地址。实际内存块必须手动初始化。因此,用户可以对其进行更改、释放和重用。编译器不管理这些内存

所以


无法工作,因为您尚未为其分配任何内存。必须使用malloc()、calloc()等来分配内存块。

char*和char[]保存实际字符串(而不仅仅是获取文本地址)

这意味着您可以像这样更改其值

scanf("%s", t2string);
因此,您应该为“%s”分配空间

此外,您还可以看到字符串a='…'和char[]a='…'之间的区别


char[]a='abc'将在编译时更改为char[]a={'a','b','c'}(可变)

这不是字符串
char*t2string这是否回答了您的问题?替换
char*t2string带有
char*t2string=malloc(20)
char*t2string=t1string。向上阅读以了解每个字符串的作用。“其中字符串声明为char*”-->
char*
是一个指针。不是指针的字符串。一个字符数组可以包含一个字符串。很好的理解,但是如果我这样做:char*t2string=“testagain”;scanf(“%s”,t2字符串);printf(“%s\n”,t2string);printf(“%c”,t2string[5]);}我认为对t2string的第一次声明和“testagain”赋值将预分配内存,但scanf()仍然不起作用。这里我还需要更多的解释。“testagain”是一个常量字符串。您可以更改此指针,但不能更改此指针指向的常量。我尝试过它,它可以在msvc 2019中工作,但在gcc 8.3中无法工作。现在,我也有点困惑。很好的洞察力,但是如果我这样做:char*t2string=“testagain”;scanf(“%s”,t2字符串);printf(“%s\n”,t2string);printf(“%c”,t2string[5]);}我认为对t2string的第一次声明和“testagain”赋值将预分配内存,但scanf()仍然不起作用。我还需要更多的解释blessedk 2小时前
“testagain”
将分配内存,printf将工作。但是
scanf()
不起作用,因为为常量字符串分配的内存是只读的。
scanf("%s", t1string);
scanf("%s", t2string);
char[i] = 'a';