如何修改C语言字符串处理代码以满足指定输入输出要求
代码修改说明
首先明确核心规则:遍历输入的整行字符串,统计不区分大小写的universe子串出现次数,根据次数输出对应内容:
- 出现0次:输出
Hello, World! - 出现n次(n≥1):输出
Hello, Universe后拼接n个感叹号
原有代码问题及修改点
- 1、输入读取逻辑错误:原有
scanf("%s", str)只能读取到第一个空格前的内容,无法读取带空格的整行输入,修改为使用fgets(str, sizeof(str), stdin)读取整行,同时去除末尾自带的换行符。 - 2、字符串匹配逻辑错误:原有
strcmp是区分大小写且将整个输入串和universe直接比对,既不符合不区分大小写的要求,也无法统计多次出现的次数。改为遍历输入串,用不区分大小写的子串匹配逻辑统计universe的出现次数,可使用POSIX标准的strcasestr函数实现不区分大小写的子串查找。 - 3、输出前缀字符串错误:原有
str1的内容为Hello Universe,缺少要求的逗号,且分配的存储空间不足,拼接感叹号会触发数组越界,直接改为输出时按需拼接即可,无需提前定义固定字符串。 - 4、计数逻辑完全错误:原有
count初始化为0,后续for循环条件i < count永远不成立,属于逻辑死区。将count改为用于统计universe的出现次数,统计完成后再根据count值走输出分支。 - 5、输出逻辑错误:原有逻辑只要单次匹配不成功就直接输出
Hello world!,没有考虑次数统计的场景。修改为判断count == 0时输出Hello, World!,否则先输出前缀Hello, Universe,再循环输出count个感叹号即可。
修改后完整可运行代码
#include<stdio.h> #include<string.h> #include<strings.h> // 用于strcasestr函数 int main() { char str[200]; const char *target = "universe"; int count = 0; char *pos; // 读取整行输入 fgets(str, sizeof(str), stdin); // 去除fgets读取的末尾换行符 str[strcspn(str, "\n")] = '\0'; // 不区分大小写统计target出现次数 pos = str; while ((pos = strcasestr(pos, target)) != NULL) { count++; pos += strlen(target); // 跳过当前匹配的内容,避免重复统计 } if (count == 0) { printf("Hello, World!\n"); } else { printf("Hello, Universe"); for (int i = 0; i < count; i++) { printf("!"); } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者AdarshThouti
相关产品推荐
相关产品推荐

