Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
字符串中的C字符串指针如何以null结尾?_C_String_Pointers_Null Terminated - Fatal编程技术网

字符串中的C字符串指针如何以null结尾?

字符串中的C字符串指针如何以null结尾?,c,string,pointers,null-terminated,C,String,Pointers,Null Terminated,假设我有一个带有参数值对的C字符串ch: #include <string.h> char ch[] = "name=John sex=male age=30"; // null-terminated C string char *p, *v; // pointers to parameter and value p = strstr(ch, "sex="); // p now points to "sex=male age=30" sscanf(p, "sex=%s", v);

假设我有一个带有参数值对的C字符串
ch

#include <string.h>
char ch[] = "name=John sex=male age=30"; // null-terminated C string
char *p, *v; // pointers to parameter and value

p = strstr(ch, "sex="); // p now points to "sex=male age=30"
sscanf(p, "sex=%s", v); // get the value for sex
printf("sex = %s\n", v); // gives "male", works as expected
printf("length of v is %i\n", strlen(v)); // gives 4
printf("is v null-terminated? %i\n", (*(v+4)=='\0')); // gives 1
#包括
char ch[]=“姓名=约翰性别=男性年龄=30”;//以null结尾的C字符串
字符*p,*v;//指向参数和值的指针
p=strstr(ch,“sex=”);//p现在指向“性别=男性年龄=30”
sscanf(p,“性别=%s”,v);//获得性的价值
printf(“性别=%s\n”,v);//给出“男性”,工作正常
printf(“v的长度为%i\n”,strlen(v));//给出4
printf(“v是否以null结尾?%i\n”,(*(v+4)='\0');//给出1
我的理解是
p
ch
中指向“sex=M age=30”,并使用与
ch
相同的空终止符
v
p
中指向“男性”,而我的问题是
v
的空终止符存储在哪里
?在
p
ch
中,它都是“male”之后的空格,这里
v
是指针,而不是缓冲区

我的问题是v的空终止符存储在哪里

没有。您正在调用,因为
v
未初始化。不仅空终止符是无效的,而且sscanf()将“male”写入
v
指向的位置也是无效的。因为
v
没有指向有效的内存位置

sscanf()
将执行空终止,但必须传递有效指针(例如
char v[5]
)。请注意,
sscanf()
根本不修改它的第一个参数。因此,
sscanf()
不会修改
ch

我的问题是v的空终止符存储在哪里

没有。您正在调用,因为
v
未初始化。不仅空终止符是无效的,而且sscanf()将“male”写入
v
指向的位置也是无效的。因为
v
没有指向有效的内存位置


sscanf()
将执行空终止,但必须传递有效指针(例如
char v[5]
)。请注意,
sscanf()
根本不修改它的第一个参数。所以
ch
不会被
sscanf()

修改,谢谢你的回答。我现在明白了,我不正确地使用了
sscanf
,尽管它对我有用。但当我在@marktolenen评论的
sscanf
之后打印
ch
时,它崩溃了。这将如何发生?正如您所说的,
sscanf
不会修改其第一个参数。这可能是因为未定义的行为。向未初始化的
v
写入可能会在某个地方结束写入。即使使用
charv[5]也会发生这种情况也是?一旦我改为
char v[5]
,就没有任何问题了。谢谢,谢谢你的回答。我现在明白了,我不正确地使用了
sscanf
,尽管它对我有用。但当我在@marktolenen评论的
sscanf
之后打印
ch
时,它崩溃了。这将如何发生?正如您所说的,
sscanf
不会修改其第一个参数。这可能是因为未定义的行为。向未初始化的
v
写入可能会在某个地方结束写入。即使使用
charv[5]也会发生这种情况也是?一旦我改为
char v[5]
,就没有任何问题了。谢谢。我现在明白了,我应该做一些类似于
char v[5]
的事情,而不是
char*v
。当我在
sscanf
之后打印
ch
时,它崩溃。没有打印,它对我来说很有用,我想:)我现在明白我应该做一些像
charv[5]
的事情,而不是
char*v
。当我在
sscanf
之后打印
ch
时,它崩溃。没有印刷,它对我来说很有用:)