我的问题是它只打印1个字母,当它应该打印整个字符串。我将衷心感谢您的帮助!再次感谢你帮助我。
#include < stdio.h >
int main(void) {
int val;
val=1;
while (val!=0) {
printf("\n");
printf("Choose\n");
printf("1) Add new letter\n");
printf("2) Empty string\n");
printf("3) Print string\n");
printf("0) Stop\n");
printf("Choice: ");
scanf("%d",&val);
printf("\n");
char sign[200];
char sign2[200];
int size;
size = strlen(sign2);
switch (val) {
case 1:
printf("Give some letter: ");
scanf("%s",&sign2);
strcpy(sign, "");
strcat(sign,sign2);
sign2[size]=sign2;
sign2[size+1]='\0';
break;
case 2:
if (val==2) {
printf("Emptied string.\n");
sign2[0] = '\0';
}
break;
case 3:
if (size == 0) {
printf("Is empty\n");
} else {
printf("String: %s\n",sign);
}
break;
case 0:
printf("Stopping.\n");
break;
default:
printf("Unknown.\n");
break;
}
}
return 0;
}
我的问题是它只打印1个字母,当它应该打印整个字符串。我将衷心感谢您的帮助!再次感谢你帮助我。
很多问题 - 但是我们可以逐一讨论
strlen
返回nul终止的char
数组的长度。在您使用strlen
时,您的案例中的数组内容是不确定的。这是未定义的行为。您可能想初始化char数组char sign2[200]={0}
,以便您可以在其上使用strlen
。 (顺便说一句 - 如果你想获得char数组的大小使用sizeof(sign2)
)scanf("%s",&sign2);
将是scanf("%s",sign2);
,因为char
数组转换(“衰变”)指向第一个元素的指针 - 这是指向sign2[0]
的指针。这就是你应该传递给scanf
的东西。你的编译器抱怨它。sign2[size]=sign2;
没有做你正在考虑的事情 - 这是试图将char*
分配给一个错误的char
变量。sign2
的东西时。理想情况下,你想得到一个char
输入,这将是scanf(" %c",&somecharvar);
。somecharvar
中获得输入后,添加它将很容易。您可以简单地获取字符串的长度,然后添加字符以及终止char
的nul。如果你正在考虑 - 那么第一次你将会做一件事 - 最初用sign2
初始化\0
。这样,即使你第一次打电话给strlen
- 它会给你0
的结果。
char somevar;
if( scanf(" %c",&somevar)!= 1){
fprintf(stderr,"Error in input\n");
exit(1);
}
size_t sz = strlen(sign2);
if(sz+1 < sizeof(sign2)){
sign2[sz]=somevar;
sign2[sz+1]=0;
} else {
fprintf(stderr,"Noe enough space\n");
exit(1);
}
strlen
返回size_t
类型的字符串的长度。 size_t
保证在C
中保持任何物体的大小。scanf
总是检查它的返回值,如果它失败你会知道它并终止程序或相应地处理它(最合理的是 - 吃掉stdin
的错误输入,因为scanf
无法解析它仍然存在)。200
或类似的硬编码值(幻数)使用macro
或常量来合并它们。