从 C 字符串中去除第一个和最后一个字符
Posted
技术标签:
【中文标题】从 C 字符串中去除第一个和最后一个字符【英文标题】:Strip first and last character from C string 【发布时间】:2010-12-16 03:02:08 【问题描述】:我有一个 C 字符串,看起来像 "Nmy stringP"
,其中 N 和 P 可以是任何字符。如何在 C 中将其编辑为 "my string"
?
【问题讨论】:
家庭作业?如果是,请添加“作业”标签。 不,不是家庭作业——只是为了好玩而学习 C。 在纯 C 中没有“字符串”之类的东西。您是否有指向缓冲区 (char *
) 或字符数组 (char[]
) 的指针?
【参考方案1】:
要“删除”第一个字符指向第二个字符:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++; /* 'N' is not in `p` */
要删除最后一个字符,请将其替换为 '\0'
。
p[strlen(p)-1] = 0; /* 'P' is not in `p` (and it isn't in `mystr` either) */
【讨论】:
这可能不起作用,因为通过将“Nmy stringP”初始化为文字,编译器/链接器可以将其放置在只读内存中,从而导致编辑失败。 @Suppressingfire:“Nmy stringP”确实是一个文字字符串,但它被复制(逐个字符)到数组mystr
。数组mystr
是可修改的。
文字字符串被复制到名为“mystr”的变量的位置。 mystr 不是指向文字的指针,它是文字的副本。
strdup()
不是标准函数。在提供它作为扩展的那些实现上,它的工作方式可能因实现而异。需要时我更喜欢malloc()
和strcpy()
。不需要演示如何删除字符串的第一个和最后一个字符。
mystr 不是指针,它是一个用字符串文字的内容初始化的数组。他的代码是正确的。【参考方案2】:
另一个选项,再次假设“编辑”意味着您要就地修改:
void topntail(char *str)
size_t len = strlen(str);
assert(len >= 2); // or whatever you want to do with short strings
memmove(str, str+1, len-2);
str[len-2] = 0;
这会修改字符串,而不像pmg 的解决方案那样生成新地址。并不是说 pmg 的回答有什么问题,但在某些情况下,这不是您想要的。
【讨论】:
【参考方案3】:除了@pmg 的回答,请注意您可以在一个语句中执行这两项操作:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;
这可能会按预期工作,但行为在 C 标准中未定义。
【讨论】:
最好不要依赖未定义的行为。 @xav0989 同意,我打算添加更多作为评论(强调不这样做的原因),而不是作为替代答案。我对此有点陌生。【参考方案4】:最有效的方法:
//Note destroys the original string by removing it's last char
// Do not pass in a string literal.
char * getAllButFirstAndLast(char *input)
int len = strlen(input);
if(len > 0)
input++;//Go past the first char
if(len > 1)
input[len - 2] = '\0';//Replace the last char with a null termination
return input;
//...
//Call it like so
char str[512];
strcpy(str, "hello world");
char *pMod = getAllButFirstAndLast(str);
最安全的方法:
void getAllButFirstAndLast(const char *input, char *output)
int len = strlen(input);
if(len > 0)
strcpy(output, ++input);
if(len > 1)
output[len - 2] = '\0';
//...
//Call it like so
char mod[512];
getAllButFirstAndLast("hello world", mod);
第二种方法效率较低但更安全,因为您可以将字符串文字传递到输入中。如果您不想自己实现它,也可以将 strdup 用于第二种方式。
【讨论】:
我在第二个实现中看到的问题是,在调用 getAllBufFirstAndLast() 之前,您需要确保输出足够大以处理副本。在这种情况下,我建议在调用中添加一个 outputLength 变量,并让被调用的函数使用 strn* 函数操作输出。 是的,这是一个前提条件,是的,您可以添加一个长度参数。 1) “最安全的方式:”将使用size_t len
而不是 int
2) 第二个代码假定 output
的大小比需要的大一号。例如。 char mod[10];
将是 UB。以上是关于从 C 字符串中去除第一个和最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章