如何更优实现C语言中两个空格分隔数组的输入与输出?
嘿,我来帮你捋捋这个问题~你的代码能实现功能,但确实有不少可以优化的空间,不管是代码简洁度还是鲁棒性都能再提升一步。
先说说原代码的小隐患:你现在依赖输入末尾的换行符终止循环,但如果用户不小心多打了数字,或者输入结束时没有换行(比如直接按Ctrl+D),就会导致数组下标越界,触发未定义行为;另外手动处理temp字符的逻辑有点绕,可读性也不算高。
下面给你两种更优的实现方案,按需选择:
方案一:利用scanf自动跳过空白的特性,简化输入逻辑
其实scanf("%d")会自动跳过所有空白字符(包括空格、换行、制表符),完全不需要手动处理换行符。直接循环读取3次就行,代码简洁很多:
#include <stdio.h> int main() { int alc[3] = {0}, bob[3] = {0}; int i; // 输入Alice的3个数字 printf("输入Alice的3个数字(空格分隔):"); for (i = 0; i < 3; i++) { scanf("%d", &alc[i]); } // 输入Bob的3个数字 printf("输入Bob的3个数字(空格分隔):"); for (i = 0; i < 3; i++) { scanf("%d", &bob[i]); } // 输出Alice的数组 printf("Alice的数组:"); for (i = 0; i < 3; i++) { printf("%d ", alc[i]); } printf("\n"); // 输出Bob的数组 printf("Bob的数组:"); for (i = 0; i < 3; i++) { printf("%d ", bob[i]); } printf("\n"); return 0; }
这个方案逻辑清晰,不管用户是把3个数字放一行,还是每个数字换一行输入,程序都能正确读取,完全不用操心换行符的问题。
方案二:按行读取+解析,提升鲁棒性
如果需要严格要求用户每行输入一组数字,或者想处理输入错误的情况(比如用户输入的数字不足3个),可以用fgets读取整行,再用sscanf解析里面的数字:
#include <stdio.h> #include <string.h> int main() { int alc[3] = {0}, bob[3] = {0}; char line[100]; // 足够容纳一行输入 int i, read_count; // 处理Alice的输入行 printf("输入Alice的3个数字(空格分隔):"); if (fgets(line, sizeof(line), stdin) != NULL) { // 从行里解析3个数字 read_count = sscanf(line, "%d %d %d", &alc[0], &alc[1], &alc[2]); if (read_count < 3) { printf("提示:Alice的输入只读取到%d个数字\n", read_count); } } // 处理Bob的输入行 printf("输入Bob的3个数字(空格分隔):"); if (fgets(line, sizeof(line), stdin) != NULL) { read_count = sscanf(line, "%d %d %d", &bob[0], &bob[1], &bob[2]); if (read_count < 3) { printf("提示:Bob的输入只读取到%d个数字\n", read_count); } } // 输出结果 printf("Alice的数组:"); for (i = 0; i < 3; i++) { printf("%d ", alc[i]); } printf("\n"); printf("Bob的数组:"); for (i = 0; i < 3; i++) { printf("%d ", bob[i]); } printf("\n"); return 0; }
这个方案能确保我们处理的是用户输入的一整行,还能检查读取到的数字数量,避免因为输入格式问题导致程序出错,鲁棒性更强。
总结一下,如果只是简单的输入需求,方案一就足够好用;如果需要更严格的输入格式检查,方案二更合适~
内容的提问来源于stack exchange,提问作者pointer accurate
相关产品推荐
相关产品推荐

