C不打印整个字符串

时间:2018-01-24 03:23:19

标签: c printing output

我的问题是它只打印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个字母,当它打算打印整个字符串时。我将衷心感谢您的帮助!再次感谢你帮助我。

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*变量。

    < / LI>
  • 每当你覆盖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或常量来合并它们。