C语言strcat实现字符转换无效,如何实现指定辅音的Goggamal转换?
C语言实现R/S/T字符的Goggamal格式转换问题解决
问题根源
你用strcat没效果,大概率是这两个原因:
- 传递给strcat的不是以'\0'结尾的合法字符串——比如直接传单个
'r'字符,strcat会把它当成字符串起始地址,后续内存是随机值,导致未定义行为,根本没法正确拼接。 - 目标缓冲区没有初始化为空字符串(即第一个字符是
'\0'),strcat找不到拼接的起始位置,自然不会修改内容。
两种解决方法
方法一:修正strcat的使用方式
如果一定要用strcat,得先生成合法的转换字符串(带结束符),再确保目标缓冲区初始为空。示例代码如下:
#include <stdio.h> #include <string.h> #include <ctype.h> void transform_char(char c, char *dest) { char temp[4]; // 存转换后的字符串(最多3字符+结束符) char lower_c = tolower(c); if (lower_c == 'r' || lower_c == 's' || lower_c == 't') { sprintf(temp, "%co%c", c, c); // 生成如ror、SoS的格式 } else { temp[0] = c; temp[1] = '\0'; // 普通字符生成单字符字符串 } strcat(dest, temp); } int main() { FILE *in = fopen("input.txt", "r"); FILE *out = fopen("output.txt", "w"); if (!in || !out) { perror("文件打开失败"); return 1; } char buffer[1024] = {0}; // 初始化缓冲区为空字符串 int c; while ((c = fgetc(in)) != EOF) { transform_char((char)c, buffer); fprintf(out, "%s", buffer); memset(buffer, 0, sizeof(buffer)); // 清空缓冲区准备下一个字符 } fclose(in); fclose(out); return 0; }
方法二:放弃strcat,直接操作字符(更高效稳妥)
这种场景下,strcat属于“大材小用”——转换后的字符数固定(普通字符1个,目标字符3个),直接逐个写入文件即可,逻辑更简单,还能避免缓冲区溢出风险:
#include <stdio.h> #include <ctype.h> int main() { FILE *in = fopen("input.txt", "r"); FILE *out = fopen("output.txt", "w"); if (!in || !out) { perror("文件打开失败"); return 1; } int c; while ((c = fgetc(in)) != EOF) { char lower_c = tolower((char)c); if (lower_c == 'r' || lower_c == 's' || lower_c == 't') { fputc((char)c, out); fputc('o', out); fputc((char)c, out); } else { fputc((char)c, out); } } fclose(in); fclose(out); return 0; }
总结
优先选第二种方法,不用折腾字符串拼接,直接处理字符写入,不仅不会出现strcat的使用错误,代码效率和可读性都更高。
内容的提问来源于stack exchange,提问作者springbook
相关产品推荐
相关产品推荐

