strtok_r() 和 strsep() 的 C 字符串替代品不会修改原始字符串指针?

Ste*_*ong 1 c split c-strings strtok strsep

我查看了 2 个 C 字符串函数 strtok_r() 和 strsep(),并注意到这两个函数都会修改传入的原始字符串的位置。

是否还有其他不修改传入的原始字符串的 C 字符串函数?

在我的应用程序中,原始字符串是动态分配的,因此我希望在解析完成后释放原始字符串。

strtok_r() 的示例

int main(){
    char * str = strdup("Tutorial and example");
    char* token;
    char* rest = str;
    
    printf("%s\n", rest);
    while ((token = strtok_r(rest, " ", &rest)))
        printf("%s\n", token);
    printf("\n%s\n",str);
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

输出

Tutorial and example                                                                                                                                                        
Tutorial                                                                                                                                                                    
and                                                                                                                                                                         
example                                                                                                                                                                     
                                                                                                                                                                            
                                                                                                                                                                            
                                                                                                                                                                            
Tutorial                                                                                                                                                                          
Run Code Online (Sandbox Code Playgroud)

在最后一行,我希望 str 指向未修改的 cstring“教程和示例”。

strsep() 也会出现类似的输出。

int main(){
    char * str = strdup("Tutorial and example");
    char* token;
    char* rest = str;

    printf("%s\n", rest); 
    while ((token = strsep(&rest, " ")))
        printf("%s\n", token);
    if (rest != NULL)
        printf("%s\n", rest);
        
    printf("%s\n", str); 
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

Ser*_*eyA 5

我认为你误会了strtok_r。它不会更改原始字符串的位置,而且它不能 - 函数不能更改传递给它的指针的值并使此更改对调用代码可见。

它可以并且将会做的是通过用 - 终止符替换标记来修改字符串本身的内容nul。所以回答你原来的问题:

在我的应用程序中,原始字符串是动态分配的,因此我希望在解析完成后释放原始字符串。

您不必做任何特别的事情。使用完原始字符串后,您可以而且应该释放它。

您看到Tutorial打印的单个单词只是因为下一个字符被替换为nul-terminator 并printf停在那里。如果您要逐个字符地检查字符串,您会发现它在其他方面保持不变。