【问题标题】:I want to make program in C printing each number of full number我想用 C 制作程序打印每个全数
【发布时间】:2020-09-03 06:50:40
【问题描述】:
#include <stdio.h>

int main() {
    char a[1000];
    int i = 0;
    scanf("%s", &a);
    while (a[i] != 0) {
        printf("%c\n", a[i]);
        i++;
    }
    printf("\n");
    return 0;
}

“给定一个最多 1000 位的大整数作为输入。编写一个程序,在接收到相应的整数后打印出该整数的每个数字。”是问题所在,我不知道我的代码中有什么不完整。我得了 4/5 分。答案必须是这样的:

输入:+456

输出:

+
4
5
6

【问题讨论】:

  • 最小更改:scanf("%s", a);(删除&amp;
  • 如果大小为 1001,您需要一个数组来保存 1000 位数字的字符串以及一个终止的感谢字节。您也应该使用”%1000s” 显示溢出,并删除&amp;
  • 提示:putchar ('\n'); 而不是 printf ("\n"); -- 格式字符串不需要转换,所以不需要调用可变参数printf函数.只需使用putchar() 将单个字符输出到stdoutfputc() 将单个字符输出到文件。
  • @나가을:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。

标签: c arrays string character


【解决方案1】:

您的代码有两个问题:

1.

scanf("%s", &a);

参数a 已经衰减为指向数组a 的第一个元素的指针 -> 所以它作为参数的类型实际上是char *。因此,&amp;a 的类型为 char (*)[1000]

%s 转换说明符的类型为 char * 的预期参数存在类型不匹配。

如果您使用 GCC 作为编译器,-Wall 选项(或分别为 -Wformat=)会向您显示关于此的警告:

warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[1000]' [-Wformat=]

    9 |     scanf("%s",&a);
      |            ~^  ~~
      |             |  |
      |             |  char (*)[1000]
      |             char *

2.

此外,如果您需要将整数 up 存储到 1000 位 - 包括 1000 位整数的情况,您忘记了您还需要一个元素来存储以字符串结尾的 null字符('\0'):

char a[1001];

否则,如果用户输入了 1000 位数字,则空字符将存储在数组边界之外,这会引发未定义的行为。


另外:

使用长度修饰符确保在用户尝试输入超过 1000 位的数字时不会发生缓冲区溢出:

scanf("%1000s", a);

或使用fgets(),默认情况下可以确保这一点,因为它需要写入的字符数作为第二个参数。

fgets(a, sizeof(a), stdin);

sizeof(a) 是合适的,因为sizeof(char) 始终是1。它获取元素的数量,a 有。


结果:

#include <stdio.h>

int main (void) {
    char a[1001];
    int i = 0;

    printf("Please enter an integral number up to 1000: ");
    fgets(a, sizeof(a), stdin);
    // scanf("%1000s", a);         Alternative to previous fgets.

    while (a[i] != 0) {
        printf("%c\n", a[i]);
        i++;
    }

    printf("\n");

    return 0;
}

【讨论】:

  • @DavidC.Rankin 非常感谢。上一篇中有些内容不完整或拼写错误。版本。在另一个编辑中更正了。
【解决方案2】:

您的代码中存在多个问题:

  • 数组太小,最多只能包含 999 位。
  • scanf() 格式应指定存储到目标数组中的最大字符数,以避免在输入过长时出现未定义行为。
  • scanf() 参数 &amp;a 不正确,应该是 a
  • 应测试scanf() 的返回值以避免在空输入文件上出现未定义的行为。

这是一个更正的版本:

#include <stdio.h>

int main() {
    char a[1002]; /* sign + 1000 digits + null terminator */
    if (scanf("%1001s", a) == 1) {
        for (int i = 0; a[i] != '\0'; i++) {
            printf("%c\n", a[i]);
        }
        printf("\n");
    } else {
        printf("error: no input\n");
    }
    return 0;
}

【讨论】:

    【解决方案3】:
    scanf("%s",&a);
    

    应该改为:

    scanf("%999s",a);
    

    或者您可以使用stdin 中的fgets 代替:

    fgets(a, 1000, stdin);
    

    Disadvantages of scanf

    【讨论】:

      【解决方案4】:

      根据您的要求,scanf 将采用 'a' 而不是 '&a'。循环也会一直持续到结束,用 '\0' 字符表示,而不是零。

      #include <stdio.h>
      
      int main(){
          char a[1000];
          int i=0;
          scanf("%s", a);
          while(a[i]!='\0')
          {
              printf("%c\n",a[i]);
              i++;
          }
          printf("\n");
          return 0;
      }
      

      【讨论】:

      • '\0'0 是同一个东西。
      • '\0'0 在 C 中是 100% 绝对完全明确绝对相同
      • @pmg 这么多形容词差不多够用了^^
      【解决方案5】:

      女士, c 中的字符串总是以空字符结尾,即 '\0' 而不仅仅是 0。 用“while(a[i]!='\0')”替换这个“while(a[i]!=0)”.. 一切都会很酷..:-)

      【讨论】:

      • '\0'0 在 C 中是 100% 绝对完全明确绝对相同
      • 你能详细说明一下吗?...while(a[i]!=0) 和 while(a[i]!='\0') 这两个意思是一样的吗?
      • 是的,在 C 源文本中,0 的值为零并键入 int...'\0' 的值为零并键入 int。例如:while (*p != 0)while (*p != '\0') 100% 相同或for(j=0;j&lt;9;j++)for(j='\0';j&lt;9;j++) 100% 相同...
      • 另外,在 C 中,sizeof '\0'sizeof 0sizeof (int) 都具有相同的值(可能是 4
      猜你喜欢
      • 2016-01-08
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多