C语言题目
表弟有个作业,让我试试,我也正好来展示代码的优化过程:
首先是实现要求,然后再优化
题目如下:
给定一个字符数组,初始化为"qqqqwwwweeeeerrrr",手动输入一个数字这个数字代表从几位开始插入"hello",原先的字符不能被覆盖例如: 输入的数字是5,最终这个字符数组内:"qqqqwhellowwweeeeerrrr"
第一版本
#include <iostream>
int main()
{
char str[] = "qqqqwwwweeeeerrrr";
int num;
printf("请输入你要插入的位置:\n");
scanf("%d", &num);
int lenStr = strlen(str);
if (num > lenStr || num < 0)
{
printf("输入的值无效!\n");
}
char res[100] = { 0 };
int count = 0;
for (size_t i = 0; i < lenStr; ++i)
{
if (i < num)
{
res[count] = str[i];
count++;
}
else if (i == num)
{
res[count] = 'H';
count++;
res[count] = 'e';
count++;
res[count] = 'l';
count++;
res[count] = 'l';
count++;
res[count] = '0';
count++;
res[count] = str[i];
count++;
}
else
{
res[count] = str[i];
count++;
}
}
res[count] = '\0';
printf("res:%s\n", res);
}
已经实现了,但是明显又臭又长,来实现第二版
#include <iostream>
int main()
{
char str[] = "qqqqwwwweeeeerrrr";
int num;
printf("请输入你要插入的位置:\n");
scanf("%d", &num);
int lenStr = strlen(str);
if (num > lenStr || num < 0)
{
printf("输入的值无效!\n");
}
char res[100] = { 0 };
int count = 0;
for (size_t i = 0; i < lenStr; ++i)
{
if (i == num)
{
res[count++] = 'H';
res[count++] = 'e';
res[count++] = 'l';
res[count++] = 'l';
res[count++] = '0';
res[count++] = str[i];
}
else
{
res[count] = str[i];
count++;
}
}
res[count] = '\0';
printf("res:%s\n", res);
return 0;
}
最后交给AI来试试,以下是AI的结果:
这段代码有几个可以优化的地方,我来帮你改进一下:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "qqqqwwwweeeeerrrr";
int num;
printf("请输入你要插入的位置:\n");
scanf("%d", &num);
int lenStr = strlen(str);
// 输入验证
if (num > lenStr || num < 0) {
printf("输入的值无效!\n");
return 1; // 输入无效时直接退出
}
char res[100] = {0};
// 1. 复制插入位置前的部分
strncpy(res, str, num);
// 2. 插入"Hello"
strcat(res, "Hello");
// 3. 复制插入位置后的部分
strcat(res, str + num);
printf("res:%s\n", res);
return 0;
}
主要优化点:
- 使用标准库函数:用
strncpy和strcat替代手动循环,代码更简洁高效 - 添加返回值:输入无效时返回错误码
- 修复拼写错误:将 "Hell0" 改为 "Hello"(如果你确实需要数字0请改回去)
- 提高可读性:逻辑更清晰,分为三个明确的步骤
如果你坚持要用循环方式,这里是一个优化版本:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "qqqqwwwweeeeerrrr";
int num;
printf("请输入你要插入的位置:\n");
scanf("%d", &num);
int lenStr = strlen(str);
if (num > lenStr || num < 0) {
printf("输入的值无效!\n");
return 1;
}
char res[100] = {0};
char insert[] = "Hello";
int insertLen = strlen(insert);
int count = 0;
// 复制插入位置前的字符
for (int i = 0; i < num; i++) {
res[count++] = str[i];
}
// 插入新字符串
for (int i = 0; i < insertLen; i++) {
res[count++] = insert[i];
}
// 复制剩余字符
for (int i = num; i < lenStr; i++) {
res[count++] = str[i];
}
res[count] = '\0';
printf("res:%s\n", res);
return 0;
}
进一步改进建议:
- 可以添加对结果数组长度的检查,防止缓冲区溢出
- 考虑使用动态内存分配来处理任意长度的字符串
- 添加更多的输入验证(比如检查是否为数字)
第一个版本使用标准库函数的方案是最推荐的,因为它更简洁、高效且不易出错。

浙公网安备 33010602011771号