C语言一维数组中toupper函数无法正常工作的问题求助
问题描述
我尝试用toupper函数和额外数组将一维数组中的关键词转换为大写,但代码无法正常运行。
原代码
#include <stdio.h> #include <stdlib.h> #include <ctype.h> int main () { char prog1[20], prog2[20]; char ch1, ch2; int j = 0; printf ("Enter a prog:"); gets(prog1); printf ("Enter keywords:"); gets(prog2); char upper = toupper(ch2); while (prog1[j]) { ch1 = prog1[j]; ch2 = prog2[j]; putchar(toupper(ch2)); j++; } return 0; }
当前运行结果
Enter a prog:aaa bbb ccc Enter keywords:bbb BBB`?
期望结果
Enter a prog:aaa bbb ccc Enter keywords:bbb aaa BBB ccc
问题分析与修正
原代码核心问题
- 逻辑完全偏离需求:当前代码是遍历
prog1的长度,直接输出prog2对应位置的字符转大写,但prog2长度远短于prog1,超出部分会读取内存垃圾值,导致乱码。 gets函数已被废弃:存在严重的缓冲区溢出风险,安全性极低。- 未实现"在原字符串中匹配关键词并替换为大写"的核心逻辑。
修正后的代码
#include <stdio.h> #include <ctype.h> #include <string.h> int main() { char prog1[100], prog2[100]; // 用fgets替代gets,避免缓冲区溢出 printf("Enter a prog:"); fgets(prog1, sizeof(prog1), stdin); // 去除fgets读取的换行符 prog1[strcspn(prog1, "\n")] = '\0'; printf("Enter keywords:"); fgets(prog2, sizeof(prog2), stdin); prog2[strcspn(prog2, "\n")] = '\0'; int prog1_len = strlen(prog1); int prog2_len = strlen(prog2); // 处理关键词为空的边界情况 if (prog2_len == 0) { printf("%s\n", prog1); return 0; } int i = 0; while (i < prog1_len) { // 检查当前位置是否匹配关键词 if (strncmp(&prog1[i], prog2, prog2_len) == 0) { // 匹配成功,转大写输出关键词 for (int k = 0; k < prog2_len; k++) { putchar(toupper(prog1[i + k])); } // 跳过关键词长度的字符,避免重复匹配 i += prog2_len; } else { // 不匹配则直接输出原字符 putchar(prog1[i]); i++; } } putchar('\n'); return 0; }
修正说明
- 替换
gets为fgets,并通过strcspn去除换行符,保证字符串处理的安全性和正确性。 - 使用
strncmp实现子串匹配,精准定位prog1中与关键词prog2一致的部分。 - 匹配到关键词时,逐个字符转大写输出;未匹配则直接输出原字符,完全符合需求逻辑。
- 增加了关键词为空的边界处理,避免异常情况。
内容的提问来源于stack exchange,提问作者Lvrnnk
相关产品推荐
相关产品推荐

