[英]strsep() usage and its alternative
#include <stdio.h>
#include <string.h>
int main() {
char *slogan = "together{kaliya} [namak]";
char *slow_gun = strdup(slogan);
char *token = strsep(&slow_gun, "{");
printf ("\n slow_gun: %s\n token: %s\n", slow_gun, token);
return 0;
}
當我執行它時:
$ cc -o try try_strsep.c
$ ./try
slow_gun: kaliya} [namak]
token: together
但是,當我將char *口號改為:
char *slogan = "kalia} [namak]";
並執行相同的程序:
$ vi try_strsep.c
$ cc -o try try_strsep.c
$ ./try
slow_gun: (null)
token: kalia} [namak]
我的問題是,所以當我使用strsep()並且輸入字符串沒有我正在尋找的模式時,返回strsep()是錯誤的 。 我可以驗證strsep()是否找不到模式的唯一方法是檢查if (slow_gun == NUll)
。
如果我有char *slogan = "together{"
那么strsep
將成功返回token
但返回slow_gun
為空(不為null
)
$ cc -o try try_strsep.c
$ ./try
slow_gun:
token: together
有沒有辦法我可以避免這個IF檢查並依賴函數返回我的substr,如果不存在,返回NULL
?
不,沒有辦法避免檢查slow_gun == NULL
。 這是對strsep
行為的描述 :
char *strsep(char **stringp, const char *delim);
描述
如果*stringp
為NULL
,則strsep()
函數返回NULL
並且不執行任何其他操作。 否則,此函數在字符串*stringp
查找第一個標記,其中標記由字符串delim
符號分隔。 通過用空字節('\\0'
)覆蓋分隔符來終止此標記,並更新*stringp
以指向令牌。 如果未找到分隔符,則將令牌視為整個字符串*stringp
,並將*stringp
NULL
。返回值
strsep()
函數返回一個指向令牌的指針,也就是說,它返回*stringp
的原始值。
因此,如果未找到匹配項,則strsep
返回指向原始字符串的指針,並將slow_gun
輸入設置為NULL。
如果分隔符是字符串中的最后一個字符,則該字符將被'\\ 0'覆蓋, slow_gun
被設置為以下字符,恰好是終止原始字符串的'\\ 0'。 這就是print語句打印空字符串的原因。
注意您使用strdup
不正確,調用者負責在該函數返回的指針上調用free
。
strsep()的返回是錯誤的
那是不對的。 strsep()
返回它找到的第一個標記 - 字符串的開頭按定義是第一個標記。 只是在這種情況下沒有找到終止令牌的分隔符(所以字符串的其余部分是令牌)。
strsep()
不打算用於“查找模式” - 它用於根據一組分隔符分隔標記。 如果要查找字符,請使用strchr()
或strpbrk()
。
strsep表現正常 - 從手冊頁 :
strsep()
函數在*stringp
引用的字符串中找到字符串delim(或終止\\0
字符)中任何字符的第一個匹配項,並用\\0
替換它。 分隔符后面的下一個字符的位置(如果到達字符串的末尾,則為NULL
)存儲在*stringp
。 返回*stringp
的原始值。
第二種情況是正確的 - 由於未找到分隔符,因此第一個參數設置為指向NULL
並返回原始字符串。 如你所說,你需要檢查if (slow_gun == NUll)
來檢測這個。
(順便說一句,這是一個令人困惑的變量名稱選擇)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.