【问题标题】:C not printing whole stringC不打印整个字符串
【发布时间】:2018-01-24 03:23:19
【问题描述】:

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

【问题讨论】:

  • size = strlen(sign2);?
  • 可以是strlen(sign),好像没什么区别。

标签: c printing output


【解决方案1】:

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

  • strlen 返回以 nul 结尾的 char 数组的长度。在您对其应用strlen 时,您的情况下的数组内容是不确定的。这是未定义的行为。您可能想要初始化 char 数组 char sign2[200]={0},以便可以在其上使用 strlen。 (顺便说一句 - 如果你想获取 char 数组的大小,请使用 sizeof(sign2)

  • scanf("%s",&amp;sign2); 将是 scanf("%s",sign2);,因为 char 数组已转换(“衰减”)为指向第一个元素的指针 - 这是指向 sign2[0] 的指针。这就是您应该传递给scanf 的内容。你的编译器抱怨它。

  • sign2[size]=sign2; 没有做您认为它正在做的事情 - 这是试图将 char* 分配给 char 变量,这是错误的。

  • 此外,每次您覆盖 sign2 中的内容时。理想情况下,您希望获得char 输入,即scanf(" %c",&amp;somecharvar);

  • somecharvar 中获得输入后,添加它会很容易。您可以简单地获取字符串的长度,然后添加字符以及终止 char 的 nul。如果您正在考虑 - 第一次会是什么情况,那么您将要做一件事 - 最初用 \0 初始化 sign2。这样,即使您第一次调用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 中任何对象的大小。

  • 1234563因为scanf 无法解析它)。
  • 这是一个很好的做法,您可以说 - 不要使用像 200 或类似的硬编码值(幻数),而是使用 macro 或常量来合并它们。

【讨论】:

  • 谢谢!从中可以学到很多东西。主要是看我是否缺少一些快速导致它无法打印整个字符串的东西。
  • @Jaakkath.:问题是它没有打印其他字符,因为你的逻辑是错误的。但现在应该可以了。
  • 您是否移除了整个开关/外壳?或者这些都应该去哪里?
  • @Jaakkath.: No..just in the case 1 where you are insert char 尽管char sign2[200]={0} 应该是你声明sign2的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多