簡體   English   中英

strsep()用法及其替代方法

[英]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);

描述
如果*stringpNULL ,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM