我的问题是它只打印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个字母,当它打算打印整个字符串时。我将衷心感谢您的帮助!再次感谢你帮助我。
答案 0 :(得分:3)
很多问题 - 但是我们可以逐一讨论
strlen
返回nul终止的char
数组的长度。在您对其应用strlen
时,您的案例中的数组内容是不确定的。这是未定义的行为。您可能希望初始化char数组char sign2[200]={0}
,以便可以在其上使用strlen
。 (顺便说一句 - 如果你想获得char数组的大小,请使用sizeof(sign2)
)
scanf("%s",&sign2);
将为scanf("%s",sign2);
,因为char
数组已转换(&#34;衰减&#34;)为指向第一个元素的指针 - 这是指向{的指针{1}}。这就是你应该传递给sign2[0]
的内容。你的编译器抱怨它。
scanf
没有按照您的想法进行操作 - 这是尝试将sign2[size]=sign2;
分配给错误的char*
变量。
每当你覆盖char
中的内容时。理想情况下,您希望获得sign2
输入,该输入将为char
。
在scanf(" %c",&somecharvar);
中获得输入后,添加它会很容易。您可以简单地获取字符串的长度,然后添加字符以及终止somecharvar
的nul。如果您正在考虑 - 第一次会有什么情况,那么您将做一件事 - 最初使用char
初始化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
总是检查它的返回值,万一它会失败,你会知道它并终止程序或相应地处理它(最合理的是 - 吃掉错误的输入来自{ {1}}因为scanf
无法解析它而仍然存在。
这是一个很好的做法,你可以说 - 而不是使用stdin
或类似的硬编码值(幻数)使用scanf
或常量来合并它们。