在我的代码中我有
char* s = strchr(first,'/');
if(s==NULL) s = "";
else s = s+1;
但我的gcc编译器在倒数第二行抱怨
warning: assignment discards qualifiers from pointer target type
根据我对ANSI C的理解,这是因为我将s(非const值)设置为字符串文字(const值)。 (我错了吗?)但我需要s为非const(因为我可能通过向它添加1来改变它的值),而且我还需要将s设置为空字符串文字。在没有编译器大喊大叫的情况下,我是否有更好的代码设计选项来实现这两个目标?
我确实启用了-Wwrite-strings标志。
答案 0 :(得分:3)
如果你想写:
char * s = "Red";
if (Massachusetts) {
s = "Blue";
}
然后只需添加const。它会正常工作。
如果你真的需要修改字符串,那么
char *s = malloc(64);
strcpy (s, "Red");
if (Massachusetts) {
strcat(s, "-not");
}
答案 1 :(得分:1)
您是否需要s
不是const
,或者您是否需要s
才能解决常量存储问题?有很大的不同。在前一种情况下,您可以简单地转换为char*
。在后一种情况下,您必须对所需的存储进行malloc(或为s
分配适当范围的char[]
值的地址)。
答案 2 :(得分:1)
如果您不打算修改s
指向的对象,请将s
的类型更改为const char *s;
。
如果你要修改它,然后将它指向一个字符串,其内容是非法的修改(无论是C语言是非法的,还是仅仅通过程序其余接口的合同)是一个严重的错误,并且你需要确保在有可能修改它的时候复制字符串。
答案 3 :(得分:0)
您应该使用strcpy
而不是分配字符串文字。问题是字符串文字是常量,s
将包含该字符串的地址,而不是字符串本身,这是坏的。
例如,如果你有:
char str[100];
str = "Hello world";
分配的100个字符的地址将替换为"Hello world"
常量字符串的地址。
将字符串设为空的最简单方法是将第一个值设置为NULL(*s = NULL
);