C不打印整个字符串

问题描述 投票:0回答:1

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

c printing output
1个回答
3
投票

很多问题 - 但是我们可以逐一讨论

  • 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或常量来合并它们。
© www.soinside.com 2019 - 2024. All rights reserved.