【发布时间】:2014-10-31 22:17:40
【问题描述】:
我想做一些简单的事情,但我一直在努力解决这个问题太久了。我有一个总是以特定“令牌”结尾的字符串。在“++”以下的情况下。我想用较短的标记替换结束标记,比如说“#”。
strstr 返回 NULL 或指向初始结束标记的指针。
strcpy 应该使用从strstr 返回的指针,并用“#\0”覆盖“++”。
至少我认为它应该这样做。相反,我得到一个“赋值使指针从没有强制转换的整数”警告。在这一点上,我已经尝试了strcpy(*newThing, "#"); 和其他一些东西。不给出错误的东西会导致段错误。
在这种情况下,C 是从堆栈上的一些不可变空间中获取原始字符串的存储空间吗?我需要使用“alloc”之一吗?我也试过了,但可能漏掉了什么。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char *thing="ssssssssssssssss++";
char *newThing;
newThing = strstr(thing, "++");
strcpy(newThing, "#");
printf("%s\n", thing);
exit(0);
}
【问题讨论】:
-
你不能修改 C 中的字符串文字(甚至不能修改数组以“替换”它的一部分)。
-
使用
strdup将字符串文字替换为堆分配的副本,或将thing定义为char thing[]以将其分配在堆栈上。此外,您应该检查newThing是否为NULL,而不是未选中将其传递给strcpy。 -
如果我将
char *thing="ssssssssssssssss++";替换为char thing[]="ssssssssssssssss++";,一切正常。 ideone.com/IOPCAI
标签: c pointers strcpy string-literals