一开始用常规思路,输入一个整数进行处理,题目要求输入的整数小于2^32,故用unsigned int输入,解法很简单。参考代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    unsigned int N;          //一开始我用的int,结果出错,修改为unsigned int就没问题
    int output[100] = { 0 }; //保存输出结果的数组,全部先初始化为0
    int i = 0;               //结果数组的下标
    
    while (scanf("%ud", &N) == 1)
    {
        int rest;
        do
        {
            rest = N % 10;
            output[i] += rest;
            N = N / 10;

        } while (N != 0);

        i++;
    }

    int j;
    for (j = 0; j < i; j++)
    {
        printf("%d\n", output[j]);
    }

    return 0;
}


然后我又想用输入字符串的方式处理,同样能得到结果,但是用scanf输入字符串处理结果正确,用fgets输入字符串结果则有问题,因为fgets函数原理如下:

char *fgets(char *buffer, int buffer_size, FILE *stream);

fegts从指定的stream(这里是stdin)中读取字符并把它们复制到buffer(这里是input)中。注意:

(1)当它读取一个换行符并存储到缓冲区之后就不会再读取。(scanf函数不会存储换行符而是直接加'\0'结尾)

(2)如果缓冲区内存储的字符数达到buffer_size - 1个时它也停止读取。在这种情况下,并不会出现数据丢失的情况,因为下一次调用fgets将从流的下一个字符开始读取。

(3)在任何一种情况下,一个NUL字节结束符将被添加到缓冲区所存储数据的末尾,使它成为一个字符串。

所以这题用fgets会出现的问题就是(1),它会将换行符'\n'存储到缓冲区input中,导致在处理字符的时候,多处理了这个字符,最后结果出错。所以我们在for循环时,截止条件将变为 len - 1。


用scanf函数输入的参考代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char input[32];           //存放输入的字符串数组
    int  output[100] = { 0 }; //存放输出结果的数组,全部初始化为0
    int  i = 0;               //结果数组的下标

    //while (fgets(input, 32, stdin) != NULL) 
    while (scanf("%s", input) != EOF)
    {
        int len = strlen(input);
        int num;
        int j;
        for (j = 0; j < len; j++)
        {
            num = input[j] - '0'; //将数字字符转化为整型数字应该 - '0'
            output[i] += num;
        }
        i++;
    }

    int k;
    for (k = 0; k < i; k++)
    {
        printf("%d\n", output[k]);
    }

    return 0;
}

用fgets函数输入的参考代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char input[32];           //存放输入的字符串数组
    int  output[100] = { 0 }; //存放输出结果的数组,全部初始化为0
    int  i = 0;               //结果数组的下标

    while (fgets(input, 32, stdin) != NULL)
    //while (scanf("%s", input) != EOF)
    {
        int len = strlen(input);
        int num;
        int j;
        for (j = 0; j < len - 1; j++) //注意此处不是 i < len ,而是 i < len - 1 , 因为用fgets接收的字符串的最后一个字符是'\n'
        {
            num = input[j] - '0'; //将数字字符转化为整型数字应该 - '0'
            output[i] += num;
        }
        i++;
    }

    int k;
    for (k = 0; k < i; k++)
    {
        printf("%d\n", output[k]);
    }

    return 0;
}


点赞(2)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论