修改c中字符串的值

时间:2014-10-21 13:36:58

标签: c string replace

我正在尝试使用for循环更改字符串中的字符,这是我的代码:

#include <stdio.h>

int main(){
char h[] = "ABCDEFGH";
printf("h : %s\n", h);
int i = 0;
for(i; i<sizeof(h)-1; i++){
    printf("i : %i\n", i);
    printf("Starting value : %d\n", h[i]);
    h[i] = "A";
    printf("Test replace h[%u] : %d\n", i, h[i]);
}
printf("Final product : %s\n", h);
}

这是我的输出:

h : ABCDEFGH
i : 0
Starting value : 65
Test replace h[0] : 117
i : 1
Starting value : 66
Test replace h[1] : 117
i : 2
Starting value : 67
Test replace h[2] : 117
i : 3
Starting value : 68
Test replace h[3] : 117
i : 4
Starting value : 69
Test replace h[4] : 117
i : 5
Starting value : 70
Test replace h[5] : 117
i : 6
Starting value : 71
Test replace h[6] : 117
i : 7
Starting value : 72
Test replace h[7] : 117
Final product : uuuuuuuu

为什么每个索引的值都是整数(迫使我使用%d而不是%s)? 这些数字代表什么? 为什么最终产品&#34; uuuuuuuu&#34;代替&#34; AAAAAAAA&#34;?以及如何更改代码以执行我要执行的操作?

2 个答案:

答案 0 :(得分:4)

你把字符串(单引号,小整数)混淆了字符串(双引号,它是以0开头的字符数组表示为第一个字符的指针)。

此:

h[i] = "A";

应该给你一个严肃的编译器警告。您应该启用并检查所有警告。

应该是:

h[i] = 'A';

分配新的字符值。您的代码所做的是获取常量字符串"A"的地址(记住:双引号是字符串)并将其粉碎成单个字符h[i]。结果是不可预测的。

单个字符可以打印为%c,也可以打印为整数。 %d

printf("on this machine, 'A' is %d\n", 'A');

以上内容将在当前许多计算机上打印65,因为用于表示字母'A'的字符编码值在ASCII和Unicode中为65。

答案 1 :(得分:1)

数组h的元素类型为char,而字符串文字"A"的类型为char[2]。这是字符串文字是字符数组。当在表达式中使用数组的名称时,它将转换为指向其第一个元素的指针。因此,您的程序具有未定义的行为,因为char类型的对象不能表示指针的值

您可以使用字符文字'A'代替字符串文字"A"。例如

h[i] = 'A';

或者您可以使用字符串文字,但只使用其中的一个元素。例如

h[i] = "A"[0];

h[i] = *"A";