教你夺冠


私信TA

用户名:835685327

访问量:156776

签 名:

相互交流 相互学习

等  级
排  名 15
经  验 22543
参赛次数 0
文章发表 84
年  龄 0
在职情况 学生
学  校 辣鸡施工大学
专  业

  自我简介:

努力刷题 熟能生巧!

一开始用常规思路,输入一个整数进行处理,题目要求输入的整数小于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;
}


 

0.0分

1 人评分

  评论区

  • «
  • »