0

我试图根据一些任意条件提前终止一个字符串,方法是:

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&R 书工作)。

4

6 回答 6

3

'a'并且"a"是两个不同的东西:第一个是字符 a,第二个是只包含字符a的文字字符串。

您正在尝试将文字字符串分配给字符。"a"是文字字符串,即 a char *,并且您的元素char[]是 a char: 整数类型,因此有关尝试将指针分配给整数的消息。该消息有点令人困惑,因为char它是一个整数类型。

所以使用:

string[i] = 'a';

但这不会终止字符串。为此,您需要:

string[i] = '\0';
于 2012-09-29T17:16:32.570 回答
1
string[i] = "a";

一定是

string[i] = 'a';

注意不同的引号。


stringchar是来自s的数组,而不是"a"a ,它是字符串文字,包含两个s - 一个 for和一个。 因此,要将元素设置为数组,您需要使用单引号。charchara\0
charchar'

于 2012-09-29T17:16:32.983 回答
1

"a"是 a char[2],它衰减为 a char*,这就是你收到警告的原因;stringis a char*so string[i]is achar这意味着您正在尝试将 a 分配char*给 a char,这是错误的。

您需要使用单引号:

string[i] = 'a';

双引号构成一个数组,char而单引号只构成一个char,因此'a'achar并将 a 分配char给 achar将起作用。

于 2012-09-29T17:17:18.247 回答
1

您的程序将更好地使用string[i] = 'a';(而不是"a")。

以防万一,请注意无法重新分配文字 string 的字符。您显示的那段代码没有这个问题,但如果您调用end_string_early("foo"...),它会。

于 2012-09-29T17:17:36.143 回答
1

"a"不是一个字符——它是一个char*(字符串)。你需要'a'.

于 2012-09-29T17:17:55.467 回答
1

string[i] = "a"应该是string[i] = 'a',"a"不同于'a', 其中 "a" 是一个文字字符串并且它 "返回一个指针, 而'a'只是一个字符。

于 2012-09-29T17:19:03.597 回答