我有以下模式的字符串:如何断线用C与/
char *str = "ai/aj/module_mat.mod";
,我想选择module_mat为我,为进一步的逻辑最终的字符串。我曾尝试使用rindex(),以便可以获取字符串的最后部分。但我无法用C做这件事。我做错了什么?
我想要的代码是 -
char *first = rindex(str, "/");
char *first = strtok(first, ".");
我有以下模式的字符串:如何断线用C与/
char *str = "ai/aj/module_mat.mod";
,我想选择module_mat为我,为进一步的逻辑最终的字符串。我曾尝试使用rindex(),以便可以获取字符串的最后部分。但我无法用C做这件事。我做错了什么?
我想要的代码是 -
char *first = rindex(str, "/");
char *first = strtok(first, ".");
你的错误就在这里:
char *str = "ai/aj/module_mat.mod";
由于str
指向一个恒定的,这应该是:
const char *str = "ai/aj/module_mat.mod";
现在你的编译器应该会告诉你其他的问题。
同理:
char *first = rindex(str, "/");
由于rindex
返回一个指针到你通过它的不变,该指针也应该是const
。
char *first = strtok(first, ".");
嗯,有什么事对strtok
文档说:
如果找到一个分隔符字节,它被覆盖以空字节 终止当前令牌,和strtok()函数节省了指向下一个字节的指针; ...
所以strtok
改变事物的指针指向,所以它传递一个指向常数坏!你不能修改一个常量。
首先,字符串文字是不可变的,所以将它绑定到可变字符指针是非常危险的。首先解决您的代码:
const char* str = "ai/aj/module_mat.mod";
接下来,使用strchr
:
#include <string.h>
const char* p = strchr(str, '/');
if (p != NULL) {
++p;
printf("Last part: %s\n", p);
} else {
printf("No '/' found in string %s.\n", str);
}
如果在字符串中找到了/
,p
将指向它,因此p
可以作为后缀子原始字符串,并且不需要修改原始字符串。我们提前p
一个跳过/
并留下字符串的最后部分。
[Demo](https://ideone.com/9jjFje) –
好的。这有助于。如果我想使用strtok(),rindex()和其他一些可能的函数从上面指定的字符串中只提取“module_mat”?因为我也有错误。 –
@AniruddhaTekade:那么,你需要一个可变字符串作为'strtok'等,所以你需要做一个副本或类似的东西。 –