字符串中的C字符串指针如何以null结尾?
假设我有一个带有参数值对的C字符串字符串中的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);
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
时,它崩溃。没有印刷,它对我来说很有用:)