-4

我有一个 char* 有这个数据“asd:asdsa”

我想删除 ':' 字符之前的内容。如何才能做到这一点?我已经看到需要我移动指针但我不想这样做的丑陋建议?

我能知道一些建议吗?

4

8 回答 8

8

在 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"

请参阅在线演示。

于 2013-06-20T13:17:03.613 回答
2

我会说混合strchr并且memmove应该这样做。

char *res = strchr(str, ':');
if (res)
  memmove(str, res + 1, strlen(res + 1) + 1);
于 2013-06-20T13:17:25.240 回答
1

你应该std::string像 Nawaz 之前所说的那样使用,但是使用原始指针你可以简单地使用my_data

char* original_data = "asd:asdasd";
char* my_data = original_data + 4; // points to: "asdasd"
于 2013-06-20T13:23:47.447 回答
1

使用 C 函数:

#include <string.h>

char *p = strchr(s, '.');

if (p != NULL)
{
    memmove(s, p + 1, strlen(p));
}
于 2013-06-20T13:26:43.173 回答
1

如果没有“丑陋”的解决方案,您将无法将其删除。

但是您可以直接使用字符串的第三种情况的地址。

printf("%s\n", &str[3]);

例如

于 2013-06-20T13:17:22.123 回答
1

你可以尝试使用strtok()

char mystr[] = "asd:asdasd";
char *split;
int second = 0;

split = strtok(mystr, ":");

  while (second < 2 && split != NULL)
  {
    split = strtok (NULL, ":");
    second++;
  }
puts(split);
于 2013-06-20T13:18:24.177 回答
0

由于您使用的是 char* ,因此您将不得不使用指针,但如果您使用的是 c++,为什么不使用std::string?

无论如何,您可以将 strstr 用于 char* 但您将操纵指针

于 2013-06-20T13:17:35.527 回答
0

如果数据指向只读位置,那么你不能修改它。它可以很容易地使用std::string.

std::string str("asd:asdsa");
size_t loc = str.find(':') + 1;
str.erase (str.begin(), str.begin() + loc);
于 2013-06-20T13:19:18.563 回答