我试图通过以下任意条件提前终止字符串:
void end_string_early(char string[], int len) {
int i;
char j;
for (i=0;i<len;i++) {
j = string[i];
if (arbitrary_condition(j)) {
string[i] = "a";
}
}
}
我收到编译错误:
警告:赋值在没有强制转换的情况下从指针生成整数
令我困惑的是,如果我使用int数组做同样的事情(将值更改为另一个int而不是a)那么它的工作原理完美。也许这与论证如何通过有关? (虽然我的印象是所有阵列都通过ref传递)我不完全确定,这是我第一次去C(通过K&amp; R书)。
答案 0 :(得分:3)
'a'
和"a"
是两个不同的东西:第一个是字符a ,第二个是仅包含字符 a 。
您正在尝试为字符分配文字字符串。 "a"
是一个文字字符串,即char *
,char[]
的元素是char
:一个整数类型,因此有关尝试指定指针的消息整数。该消息有点令人困惑,因为char
是一个整数类型。
所以使用:
string[i] = 'a';
但是这不会终止字符串。为此你需要:
string[i] = '\0';
答案 1 :(得分:1)
string[i] = "a";
必须是
string[i] = 'a';
请注意不同的引号。
string
是来自char
的数组,而"a"
不是 a char
,它是字符串文字,包含两个{{1} }} - 一个用于char
和一个a
因此,要将\0
元素设置为char
数组,您需要使用单引号char
。
答案 2 :(得分:1)
"a"
是char[2]
,它会衰减到char*
,这就是你收到警告的原因; string
是char*
,因此string[i]
是char
,这意味着您正在尝试将char*
分配给char
,这是错误的。
您需要使用单引号:
string[i] = 'a';
双引号会生成char
数组,单引号只会生成一个char
,因此'a'
为char
并为char
分配char
{{1}}可以使用。
答案 3 :(得分:1)
使用string[i] = 'a';
(而不是"a"
),您的计划将更有效。
以防万一,请注意it's not possible to re-assign the chars of a literal string。你展示的那段代码没有这个问题,但如果你打电话给end_string_early("foo"...)
,它就会。
答案 4 :(得分:1)
"a"
不是字符 - 它是char*
(字符串)。您需要'a'
。
答案 5 :(得分:1)
string[i] = "a"
应为string[i] = 'a'
,"a"
与'a'
不同,其中“a”是文字字符串,它“返回指针,{{1}只是一个角色。