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;
}

主要优化点:

  1. 使用标准库函数:用 strncpystrcat 替代手动循环,代码更简洁高效
  2. 添加返回值:输入无效时返回错误码
  3. 修复拼写错误:将 "Hell0" 改为 "Hello"(如果你确实需要数字0请改回去)
  4. 提高可读性:逻辑更清晰,分为三个明确的步骤

如果你坚持要用循环方式,这里是一个优化版本:

#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;
}

进一步改进建议:

  • 可以添加对结果数组长度的检查,防止缓冲区溢出
  • 考虑使用动态内存分配来处理任意长度的字符串
  • 添加更多的输入验证(比如检查是否为数字)

第一个版本使用标准库函数的方案是最推荐的,因为它更简洁、高效且不易出错。

posted @ 2025-11-25 23:07  Tlink  阅读(12)  评论(0)    收藏  举报