2017-10-21 126 views
0

比方说,我有一个C字符串ch与参数值对:​​字符串中的C字符串指针如何​​以空字符结尾?

#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 

我的理解是,p分“性别= M年龄= 30” ch,并使用相同的空终止为chv指向p中的“男性”我的问题是v的空终止符存储在?这是pch中的“男性”之后的空格,这里的v是指针,而不是缓冲区。

+0

我现在明白我应该做一些类似'char v [5]'而不是'char * v'的东西。在'sscanf'后面打印'ch'时崩溃。没有打印,它为我想:) –

回答

2

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

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

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

+0

谢谢你的答案。我现在明白我正在使用'sscanf',虽然它对我有用。但是当我在'sscanf'后面打印'ch'时,@Mark Tolenen评论说,它崩溃了。这将如何发生?正如你所说'sscanf'不会修改它的第一个参数。 –

+0

这可能是由于*未定义的行为*。写入未初始化的'v'可能会在某处写入。即使使用'char v [5]'也会发生这种情况吗? – usr

+0

一旦我改成'char v [5]',就没有任何问题。谢谢。 –