【发布时间】:2015-01-11 20:11:17
【问题描述】:
我正在尝试使用指针而不是 strcat 连接两个字符串,由空格分隔。我已经让串联工作了,但是当我尝试打印串联的字符串时,它只打印第一个字符串。
代码:
#include <stdio.h>
int main(void){
char string1[10];
char string2[10];
char fullString[21];
char *string1Ptr = string1;
char *string2Ptr = string2;
char *fullStringPtr = fullString;
printf("Enter first string: ");
scanf_s("%s", &string1, 10);
fflush(stdin);
printf("Enter second string: ");
scanf_s("%s", &string2, 10);
fflush(stdin);
for (int i = 0; i < 21; ++i){
if (i < 10){
fullStringPtr[i] = string1Ptr[i];
}
else if (i == 10){
fullStringPtr[i] = ' ';
}
else if (i > 10){
fullStringPtr[i] = string2Ptr[i - 11];
}
}
printf("%s\n", fullString);
//printf("%c", fullString[11]);
getchar();
return (0);
}
如果我输入 Hello 作为第一个字符串,World 作为第二个字符串,打印输出只是显示“Hello”。但是,如果我尝试在第二个字符串中的特定位置打印字符,例如fullString[11],我得到了应该在那个位置的字符,在这种情况下是 W。
第二个字符串显然在那里,printf 只是不打印它。我缺少关于 printf 的一些东西吗?
【问题讨论】:
-
fullString存储为"Hello\0\0\0\0\0 World\0\0\0\0\0\0",但由于 C 字符串以空值结尾,printf在第一个\0处停止 -
所以...在循环中检查 \0 并用空格替换,同时处理第一个字符串。
-
@EricJ。那是行不通的,因为这样可能会复制未初始化的值,从而导致未定义的行为。
-
哦,对了......所以@frxstrem 的陈述也不一定正确,因为第一个字符串中第一个 \0 之后的值是未定义的。因此,无论源字节是什么,我猜想设置从第一个字符串复制的第一个 \0 及之后的内容。