2017-10-21 169 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]',就沒有任何問題。謝謝。 –