一开始用常规思路,输入一个整数进行处理,题目要求输入的整数小于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 人评分
回文数(一) (C语言代码)浏览:809 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:940 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:631 |
WU-链表数据求和操作 (C++代码)浏览:1382 |
IP判断 (C语言代码)浏览:819 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:590 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:1100 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:627 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:532 |
1231题解(注意理解“输入多个测试实例”)浏览:830 |