我有一个 char* 有这个数据“asd:asdsa”
我想删除 ':' 字符之前的内容。如何才能做到这一点?我已经看到需要我移动指针但我不想这样做的丑陋建议?
我能知道一些建议吗?
在 C 中,您可以这样做:
char *newString = originalString + 4;
现在,如果您不想这样做,请告诉我们原因。告诉我们问题!
此外,如果您不知道它是否是4
或其他东西(只能在运行时知道),那么使用循环找出 的索引':'
并使用它来代替4
. 这是一项简单的任务。自己试试。祝你好运。:-)
我保留这部分只是为了学习目的,因为这个问题最初在我写它时被标记为 C++,我认为它可以帮助那些偶尔使用 C++ 工作的 C 程序员。
在 C++ 中,std::string
简化了您对字符串所做的许多事情。
std::string s = "asd:asdsa"; //#include <string>
s = s.substr(s.find(':') + 1);
在此代码中,substr()
返回 之后的字符串:
,这意味着它的值为"asdsa"
。
请参阅在线演示。
我会说混合strchr
并且memmove
应该这样做。
char *res = strchr(str, ':');
if (res)
memmove(str, res + 1, strlen(res + 1) + 1);
你应该std::string
像 Nawaz 之前所说的那样使用,但是使用原始指针你可以简单地使用my_data
:
char* original_data = "asd:asdasd";
char* my_data = original_data + 4; // points to: "asdasd"
使用 C 函数:
#include <string.h>
char *p = strchr(s, '.');
if (p != NULL)
{
memmove(s, p + 1, strlen(p));
}
如果没有“丑陋”的解决方案,您将无法将其删除。
但是您可以直接使用字符串的第三种情况的地址。
printf("%s\n", &str[3]);
例如
你可以尝试使用strtok()
char mystr[] = "asd:asdasd";
char *split;
int second = 0;
split = strtok(mystr, ":");
while (second < 2 && split != NULL)
{
split = strtok (NULL, ":");
second++;
}
puts(split);
由于您使用的是 char* ,因此您将不得不使用指针,但如果您使用的是 c++,为什么不使用std::string
?
无论如何,您可以将 strstr 用于 char* 但您将操纵指针
如果数据指向只读位置,那么你不能修改它。它可以很容易地使用std::string
.
std::string str("asd:asdsa");
size_t loc = str.find(':') + 1;
str.erase (str.begin(), str.begin() + loc);