如何截断C语言中的char*?

13

就是这么简单。顺便说一下,我正在使用C++。我已经阅读了cplusplus.com的cstdlib库函数,但我找不到一个简单的函数来做这个。 我知道字符的长度,只需要删除它的最后三个字符。我可以使用C++字符串,但这是用于处理文件,需要使用char*,我不想进行从字符串到C字符的转换。

5个回答

28

如果您不需要将字符串复制到其他地方并且可以更改它

/* make sure strlen(name) >= 3 */
namelen = strlen(name); /* possibly you've saved the length previously */
name[namelen - 3] = 0;
如果你需要复制它(因为它是字符串字面量或者你想保留原始值),
/* make sure strlen(name) >= 3 */
namelen = strlen(name); /* possibly you've saved the length previously */
strncpy(copy, name, namelen - 3);
/* add a final null terminator */
copy[namelen - 3] = 0;

9

我认为你的一些帖子在翻译中有所遗漏。

要在C语言中截取字符串,只需在所需位置插入终止空字符即可。然后,所有标准函数都将把该字符串视为具有新长度。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char string[] = "one one two three five eight thirteen twenty-one";

    printf("%s\n", string);

    string[strlen(string) - 3]  = '\0';

    printf("%s\n", string);

    return 0;
}

5

如果您知道字符串的长度,可以使用指针算术运算获取最后三个字符的字符串:

const char* mystring = "abc123";
const int len = 6;

const char* substring = mystring + len - 3;

请注意,substring 指向与 mystring 相同的内存,并且只在 mystring 有效且未更改时才有效。这种方法有效的原因是 c 字符串在开头没有任何特殊标记,只有结尾处的 NULL 终止符。
我理解你的问题是想要获取最后三个字符并删除开头,而不是像 David Heffernan 那样阅读它,我们中有一个显然是错误的。

1

了解C语言中char*“字符串”如何工作可能会有所帮助:

您从char*指向的字符开始阅读,直到遇到\0字符(或简单地为0)。

因此,如果我有

char* str = "theFile.nam";

那么str+3表示字符串File.nam

但是你想要删除最后三个字符,所以你需要像这样的东西:

char str2[9];
strncpy (str2,str,8); // now str2 contains "theFile.#" where # is some character you don't know about
str2[8]='\0'; // now str2 contains "theFile.\0" and is a proper char* string.

0
bool TakeOutLastThreeChars(char* src, int len) {
  if (len < 3) return false;
  memset(src + len - 3, 0, 3);
  return true;
}

我认为修改字符串内存是安全的,因为你说过要删除最后三个字符。我只是用"NULL"或0覆盖了最后三个字符。


2
memset 似乎有点过于强大了。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接