如何截断C char*?

问题描述 投票:0回答:6

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

c string char
6个回答
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 覆盖最后三个字符。


0
投票

如果您已经知道字符串允许的最大长度并且想要截断超过该长度的字符串,您可以执行以下操作:

#define min(a, b) (a < b ? a : b)
#define MAX_LENGTH 10
char myString[] = "My very long string!";
myString[min(strlen(myString), MAX_LENGTH)] = '\0';
© www.soinside.com 2019 - 2024. All rights reserved.