我正在尝试使用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;?以及如何更改代码以执行我要执行的操作?
答案 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";