赵珂夷 发表于 6 天前

两个insert函数实现功能区别

本帖最后由 赵珂夷 于 2025-11-20 23:57 编辑

代码1(我写的)程序思路:从先将s1的n位以后部分向后挪动,再将s2的字符串加入到字符串s1中
#include <stdio.h>
#include <string.h>
void insert(char *s1,char *s2,int n)
{
    int i;
    int l1=0,l2=0;
    while (s1!=' '&&s1!='\0') l1++;
    while (s2!=' '&&s2!='\0') l2++;
    int k=0;

    if(n>l1||n<0||s1==NULL||s2==NULL) printf("error");

    else{
      for(i=l1;i>=n;i--)
      {
            s1=s1;
      }
      
      for(i=n;i<n+l2;i++)
      {
            s1=s2;
            k++;
      }
      s1=' ';
      s1='\0';
    }
}
代码2:学长/姐祖传代码 程序思路:将s1从第n项以及之后的项在s3中进行保存,将s2复制到s1的n位及以后位置,再将s3接入s1.
#include <stdio.h>
#include <string.h>
void insert(char * s1,char * s2,int n)
{
    int i,len1,len2,j;
    char s3={0};
    if(n<0||s1==NULL||s2==NULL)
    {
            printf("error");
            return;
    }
    for(len1=0;s1!=' '&&s1!='\0';len1++);
    for(len2=0;s2!=' '&&s2!='\0';len2++);
    if(n>len1)
    {
            printf("error");
            return;
    }
    for(i=n,j=0;i<len1;*(s3+j++)=*(s1+i++));
    for(i=n,j=0;j<len2;*(s1+i++)=*(s2+j++));
    for(i=n+len2,j=0;i<len1+len2;*(s1+i++)=*(s3+j++));
    *(s1+len1+len2)=' ';
    return;
}
我认为自己的函数编译输出结果正常
但是在学校C语言作业系统中评分为85分,以下是题目:
实现在字符串的内部增加字符串。

void insert(char * s1,char * s2, int n);
将s2指向的字符串的拷贝,添加到s1第n个字符的位置,原位置的字符后移。n=0时,s2增加到s1的首部;
n=s1的字符串长度时,s2增加到s1的末尾。

注意:使用空格字符来表示字符串的结束。
例如source指向位置,依次保存了字符'a',字符'b',字符空格' ',字符'c',则source指向的字符串为"ab"。

保存为functions.cpp。
遇到异常情况,输出"error";否则不要随意输出,会视为错误。
请问可能是哪些测试点我没有考虑到呢?或者说我的程序1和程序2有哪些实现功能上的区别?求问求问TAT

   

赵珂夷 发表于 6 天前

解决方法:将第二个for循环里面的内容更改成
for(i=0;i<l2;i++)
      {
            s1=s2;
      }
得分就是100了
原理不太懂

FishC 发表于 6 天前

两个 insert 函数都旨在将字符串 s2 插入到字符串 s1 的第 n 位,但实现方式和正确性有显著区别。以下是详细分析:

代码1(你写的)存在多个错误,无法正常工作:
- 长度计算错误:在 while 循环中,s1 和 s2 是指针,但代码未解引用(例如应使用 *s1 检查字符),导致无限循环或错误计数。
- 字符移动逻辑错误:for 循环中的 s1=s1 和 s1=s2 未实际移动或复制字符,只是重复赋值指针。
- 未处理字符串终止符:最后设置 s1=' ' 和 s1='\0' 可能覆盖数据,且未正确分配空间。

代码2(学长/姐的祖传代码)采用更安全的思路:
- 使用临时数组 s3 保存 s1 中第 n 位后的部分,避免直接覆盖。
- 先复制 s2 到 s1 的指定位置,再追加 s3,确保数据完整性。

主要功能区别:

[*]代码1因逻辑错误无法实现插入,可能导致程序崩溃或错误输出。
[*]代码2通过临时存储正确实现插入,适用于大多数情况。


建议修改代码1:使用标准字符串函数(如 strcpy 和 memmove)或参考代码2的思路。例如,正确实现应计算长度、检查边界,并移动字符:


#include <stdio.h>
#include <string.h>
void insert(char *s1, char *s2, int n) {
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    if (n < 0 || n > len1 || s1 == NULL || s2 == NULL) {
      printf("error");
      return;
    }
    // 移动原字符串部分
    memmove(s1 + n + len2, s1 + n, len1 - n + 1);
    // 插入新字符串
    memcpy(s1 + n, s2, len2);
}


总之,代码2更可靠,而代码1需修正基础错误。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

赵珂夷 发表于 6 天前

本帖最后由 赵珂夷 于 2025-11-20 23:22 编辑

FishC 发表于 2025-11-20 23:11
两个 insert 函数都旨在将字符串 s2 插入到字符串 s1 的第 n 位,但实现方式和正确性有显著区别。以下是详 ...

你可以再看一看题目的要求,题目要求“ ”表示字符串的结束,但strlen是不是会计算空格后的字符数呢?这里可能有问题。请根据题目要求再帮我修改一下代码@FishC

FishC 发表于 6 天前

赵珂夷 发表于 2025-11-20 23:17
FishC 发表于 2025-11-20 23:11
两个 insert 函数都 ...

两个 insert 函数都旨在将字符串 s2 插入到字符串 s1 的第 n 位(从0开始索引),但实现方式和正确性有显著区别。代码1(你写的)存在多个错误,无法正常工作;代码2(学长/姐的祖传代码)采用临时数组保存部分字符串的思路更可靠,但未提供完整代码。以下是详细分析:

代码1的主要错误:
- 长度计算错误:while 循环中未解引用指针(应使用 *s1 和 *s2 检查字符),且指针未移动,导致无限循环或错误计数。
- 字符移动逻辑错误:for 循环中的 s1=s1 和 s1=s2 未实际移动或复制字符,只是重复赋值指针。
- 终止符处理错误:s1=' ' 和 s1='\0' 可能覆盖数据,且未正确设置字符串结束。

代码2的思路优势:
- 使用临时数组 s3 保存 s1 中第 n 位后的部分,避免直接覆盖。
- 先复制 s2 到 s1 的指定位置,再追加 s3,确保数据完整性。

功能区别:
代码1因逻辑错误无法实现插入,可能导致程序崩溃或错误输出;代码2通过临时存储正确实现插入,但需注意缓冲区大小。

根据题目要求,字符串以空格 ' ' 或空字符 '\0' 作为结束标志。以下是修正后的代码1,使用自定义长度计算和字符移动:


#include <stdio.h>

void insert(char *s1, char *s2, int n) {
    int len1 = 0, len2 = 0;
    char *p;

    // 计算 s1 长度直到遇到 ' ' 或 '\0'
    p = s1;
    while (*p != ' ' && *p != '\0') {
      len1++;
      p++;
    }

    // 计算 s2 长度直到遇到 ' ' 或 '\0'
    p = s2;
    while (*p != ' ' && *p != '\0') {
      len2++;
      p++;
    }

    // 检查参数有效性
    if (n < 0 || n > len1 || s1 == NULL || s2 == NULL) {
      printf("error");
      return;
    }

    // 移动 s1 中从位置 n 开始的字符(包括终止符)向后移动 len2 位
    for (int i = len1; i >= n; i--) {
      s1 = s1;
    }

    // 复制 s2 的有效字符到 s1 的位置 n
    for (int i = 0; i < len2; i++) {
      s1 = s2;
    }

    // 设置字符串以 '\0' 结束
    s1 = '\0';
}


修正说明:
- 使用循环计算字符串长度,以 ' ' 或 '\0' 为结束标志。
- 移动字符时,从后向前遍历,避免覆盖。
- 插入后强制以 '\0' 终止,符合C语言标准。
- 假设 s1 有足够空间容纳插入后的字符串。

代码2的思路类似,但使用临时数组可能更易读,但需额外内存。建议优先使用修正后的代码1。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

FishC 发表于 6 天前

赵珂夷 发表于 2025-11-20 23:57
解决方法:将第二个for循环里面的内容更改成
for(i=0 ...

根据你的反馈,我重新分析了代码1的问题,并采纳了你的修改建议。关键点在于:字符串以空格 ' ' 或空字符 '\0' 作为结束标志,因此不能直接使用 `strlen`(它会计算到 '\0' 为止,可能包含空格后的字符)。以下是修正后的代码1,主要更改包括:
- 使用循环计算字符串长度,以 ' ' 或 '\0' 为结束标志。
- 修正字符移动逻辑:从后向前移动 s1 的字符,避免覆盖。
- 将第二个 for 循环改为 `for(i=0; i < len2; i++)` 来正确复制 s2 的字符。

修正后的代码:


#include <stdio.h>

void insert(char *s1, char *s2, int n) {
    int len1 = 0, len2 = 0;
    int i;

    // 计算 s1 长度,直到遇到 ' ' 或 '\0'
    for (i = 0; s1 != ' ' && s1 != '\0'; i++) {
      len1++;
    }

    // 计算 s2 长度,直到遇到 ' ' 或 '\0'
    for (i = 0; s2 != ' ' && s2 != '\0'; i++) {
      len2++;
    }

    // 检查参数有效性
    if (n < 0 || n > len1 || s1 == NULL || s2 == NULL) {
      printf("error");
      return;
    }

    // 移动 s1 中从位置 n 开始的字符(包括终止符)向后移动 len2 位
    for (i = len1; i >= n; i--) {
      s1 = s1;
    }

    // 复制 s2 的字符到 s1 的位置 n(使用 for(i=0; i < len2; i++))
    for (i = 0; i < len2; i++) {
      s1 = s2;
    }

    // 字符串以移动后的终止符(' ' 或 '\0')自然结束,无需额外设置
}


修改说明:
- 长度计算:通过循环遍历字符,直到遇到 ' ' 或 '\0',确保只计算有效部分。
- 字符移动:从后向前移动,避免覆盖未处理字符。
- 字符复制:使用 for(i=0; i < len2; i++) 正确索引 s2 的每个字符。
- 终止符处理:移动循环已包含原字符串的终止符,因此插入后字符串能正确结束。

这个版本解决了原代码1的错误,并符合题目要求。如果 s1 的缓冲区不足,可能导致溢出,使用时需确保空间足够。代码2的思路(使用临时数组)也更安全,但修正后的代码1更简洁。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

haungsm 发表于 前天 14:13

t.bilibili.com/1138708779237376004/
t.bilibili.com/1138708762066944000/
t.bilibili.com/1138708762097352713/
t.bilibili.com/1138708740575330342/
t.bilibili.com/1138708740606787588/
t.bilibili.com/1138708723448938535/
t.bilibili.com/1138708723412238343/
t.bilibili.com/1138708706219786240/
t.bilibili.com/1138708706256486425/
t.bilibili.com/1138708689051451397/
t.bilibili.com/1138708684778504213/
t.bilibili.com/1138708671861096456/
t.bilibili.com/1138708671906185218/
t.bilibili.com/1138708654710587400/
t.bilibili.com/1138708650374725667/
t.bilibili.com/1138708637533863938/
t.bilibili.com/1138708633254625280/
t.bilibili.com/1138708616069513254/
t.bilibili.com/1138708616074756104/
t.bilibili.com/1138708598891741206/
t.bilibili.com/1138708598845603845/
t.bilibili.com/1138708581709774857/
t.bilibili.com/1138708581661540368/
t.bilibili.com/1138708564481671185/
t.bilibili.com/1138708564507885588/
t.bilibili.com/1138708547312287784/
t.bilibili.com/1138708547318579202/
t.bilibili.com/1138708530163875907/
t.bilibili.com/1138708530159681536/
t.bilibili.com/1138708512952549393/
t.bilibili.com/1138708512979812355/
t.bilibili.com/1138708495766388740/
t.bilibili.com/1138708495777923072/
t.bilibili.com/1138708478579179568/
t.bilibili.com/1138708469996584965/
t.bilibili.com/1138708461394067456/
t.bilibili.com/1138708452806230017/
t.bilibili.com/1138708444256141346/
t.bilibili.com/1138708431339782180/
t.bilibili.com/1138708427088855056/
t.bilibili.com/1138708414208147473/
t.bilibili.com/1138708409898500115/
t.bilibili.com/1138708397026181157/
t.bilibili.com/1138708392738553863/
t.bilibili.com/1138708384093044738/
t.bilibili.com/1138708375521984535/
t.bilibili.com/1138708362653859862/
t.bilibili.com/1138708358360989700/
t.bilibili.com/1138708349728063494/
t.bilibili.com/1138708332563922950/
t.bilibili.com/1138708332594331651/
t.bilibili.com/1138708315384053762/
t.bilibili.com/1138708311078600709/
t.bilibili.com/1138708298244030467/
t.bilibili.com/1138708293917605905/
t.bilibili.com/1138708281048432648/
t.bilibili.com/1138708276759756820/
t.bilibili.com/1138708263839203335/
t.bilibili.com/1138708255248220160/
t.bilibili.com/1138708242367512594/
t.bilibili.com/1138708242409455624/
t.bilibili.com/1138708225205469221/
t.bilibili.com/1138708225226440712/
t.bilibili.com/1138708208046571538/
t.bilibili.com/1138708203759992851/
t.bilibili.com/1138708190845730832/
t.bilibili.com/1138708186557054997/
t.bilibili.com/1138708173658521605/
t.bilibili.com/1138708173665861666/
t.bilibili.com/1138708156500672534/
t.bilibili.com/1138708156515352579/
t.bilibili.com/1138708139284103173/
t.bilibili.com/1138708139285151746/
t.bilibili.com/1138708122096893955/
t.bilibili.com/1138708117812412425/
t.bilibili.com/1138708100672389143/
t.bilibili.com/1138708083442188313/
t.bilibili.com/1138708061967351808/
t.bilibili.com/1138708049085595656/
t.bilibili.com/1138708040551235602/
t.bilibili.com/1138708031931940870/
t.bilibili.com/1138708023336763401/
t.bilibili.com/1138708014767800326/
t.bilibili.com/1138708006138019858/
t.bilibili.com/1138707997586882562/
t.bilibili.com/1138707989009530882/
t.bilibili.com/1138707980419596291/
t.bilibili.com/1138707976087928837/
t.bilibili.com/1138707958899671058/
t.bilibili.com/1138707954631966738/
t.bilibili.com/1138707946047275010/
t.bilibili.com/1138707937437417475/
t.bilibili.com/1138707924578730017/
t.bilibili.com/1138707920262791175/
t.bilibili.com/1138707907405152263/
t.bilibili.com/1138707907377889317/
t.bilibili.com/1138707890220040196/
t.bilibili.com/1138707885893615617/
t.bilibili.com/1138707873033879554/
t.bilibili.com/1138707868715843592/
t.bilibili.com/1138707851551703040/
t.bilibili.com/1138707851532828673/
t.bilibili.com/1138707838639538183/
t.bilibili.com/1138707834369736741/
t.bilibili.com/1138707817205596177/
t.bilibili.com/1138707817198256134/
t.bilibili.com/1138707799982735408/
t.bilibili.com/1138707799982735360/
t.bilibili.com/1138707782844809225/
t.bilibili.com/1138707782791331843/
t.bilibili.com/1138707765669134338/
t.bilibili.com/1138707765638725632/
t.bilibili.com/1138707752770600965/
t.bilibili.com/1138707744180666370/
t.bilibili.com/1138707735584440343/
t.bilibili.com/1138707722676469785/
t.bilibili.com/1138707714088632337/
t.bilibili.com/1138707705538543639/
t.bilibili.com/1138707696910860326/
t.bilibili.com/1138707688358674435/
t.bilibili.com/1138707679764545540/
t.bilibili.com/1138707671174610964/
t.bilibili.com/1138707666867060738/
t.bilibili.com/1138707653995790341/
t.bilibili.com/1138707649666220055/
t.bilibili.com/1138707632496836608/
t.bilibili.com/1138707632527245328/
t.bilibili.com/1138707615344230409/
t.bilibili.com/1138707615306481669/
t.bilibili.com/1138707598108786694/
t.bilibili.com/1138707593829548067/
t.bilibili.com/1138707580965617689/
t.bilibili.com/1138707568084910088/
t.bilibili.com/1138707555164356616/
t.bilibili.com/1138707555203153922/
t.bilibili.com/1138707538030624775/
t.bilibili.com/1138707537978195971/
t.bilibili.com/1138707520857047058/
t.bilibili.com/1138707520839221287/
t.bilibili.com/1138707503650963458/
t.bilibili.com/1138707503618457606/
t.bilibili.com/1138707486491017235/
t.bilibili.com/1138707482205487107/
t.bilibili.com/1138707469320585218/
t.bilibili.com/1138707460722262018/
t.bilibili.com/1138707447842603031/
t.bilibili.com/1138707447831068681/
t.bilibili.com/1138707430665879577/
t.bilibili.com/1138707422051827718/
t.bilibili.com/1138707413456650244/
t.bilibili.com/1138707409158537221/
t.bilibili.com/1138707396252663817/
t.bilibili.com/1138707387657486345/
t.bilibili.com/1138707374779924483/
t.bilibili.com/1138707361946402818/
t.bilibili.com/1138707353334448135/
t.bilibili.com/1138707349005926423/
t.bilibili.com/1138707336125218836/
t.bilibili.com/1138707331877437462/
t.bilibili.com/1138707318975758344/
t.bilibili.com/1138707314680791040/
t.bilibili.com/1138707306053107720/
t.bilibili.com/1138707297513504786/
t.bilibili.com/1138707288917278723/
t.bilibili.com/1138707280307421186/
t.bilibili.com/1138707271707000835/
t.bilibili.com/1138707263153766424/
t.bilibili.com/1138707250259427381/
t.bilibili.com/1138707245947682816/
t.bilibili.com/1138707237378719768/
t.bilibili.com/1138707224478089218/
t.bilibili.com/1138707215867183126/
t.bilibili.com/1138707211585847302/
t.bilibili.com/1138707198690459684/
t.bilibili.com/1138707190086893573/
t.bilibili.com/1138707177204088838/
t.bilibili.com/1138707172945821701/
t.bilibili.com/1138707160069308425/
t.bilibili.com/1138707155758612488/
t.bilibili.com/1138707138590277636/
t.bilibili.com/1138707138578743317/
t.bilibili.com/1138707125717958656/
t.bilibili.com/1138707121395728391/
t.bilibili.com/1138707104244170771/
t.bilibili.com/1138707104184401929/
t.bilibili.com/1138707091348783120/
t.bilibili.com/1138707087060107267/
t.bilibili.com/1138707069848780809/
t.bilibili.com/1138707069849829378/
t.bilibili.com/1138707052684640259/
t.bilibili.com/1138707052646891525/
t.bilibili.com/1138707035478556681/
t.bilibili.com/1138707031190929413/
t.bilibili.com/1138707018314416153/
t.bilibili.com/1138707013995331592/
t.bilibili.com/1138707005450485765/
t.bilibili.com/1138706992565583894/
t.bilibili.com/1138706979671244803/
t.bilibili.com/1138706979689070610/
t.bilibili.com/1138706958163902481/
t.bilibili.com/1138706958190116865/
t.bilibili.com/1138706940975644676/
t.bilibili.com/1138706941002907650/
t.bilibili.com/1138706923838767112/
t.bilibili.com/1138706923835621378/
t.bilibili.com/1138706906641072137/
t.bilibili.com/1138706893751975944/
t.bilibili.com/1138706889449668609/
t.bilibili.com/1138706880905871377/
t.bilibili.com/1138706872318033925/
t.bilibili.com/1138706863708176386/
t.bilibili.com/1138706855100416021/
t.bilibili.com/1138706842234388486/
t.bilibili.com/1138706837898526720/
t.bilibili.com/1138706825054519298/
t.bilibili.com/1138706820729143317/
t.bilibili.com/1138706807842144265/
t.bilibili.com/1138706803579682841/
t.bilibili.com/1138706786418688009/
t.bilibili.com/1138706786369404936/
t.bilibili.com/1138706769185341446/
t.bilibili.com/1138706769218895893/
t.bilibili.com/1138706752018055175/
t.bilibili.com/1138706752043220995/
t.bilibili.com/1138706734832943113/
t.bilibili.com/1138706730543218696/
t.bilibili.com/1138706713376981016/
t.bilibili.com/1138706713391661073/
t.bilibili.com/1138706700478447632/
t.bilibili.com/1138706696202354693/
t.bilibili.com/1138706683285995543/
t.bilibili.com/1138706678991028231/
t.bilibili.com/1138706666141777929/
t.bilibili.com/1138706661853102103/
t.bilibili.com/1138706648958763015/
t.bilibili.com/1138706644654358528/
t.bilibili.com/1138706631750582310/
t.bilibili.com/1138706627498606615/
t.bilibili.com/1138706614583296001/
t.bilibili.com/1138706610265260033/
t.bilibili.com/1138706593147256833/
t.bilibili.com/1138706593114750984/
t.bilibili.com/1138706575945367553/
t.bilibili.com/1138706575963193361/
t.bilibili.com/1138706558763401222/
t.bilibili.com/1138706558744526855/
页: [1]
查看完整版本: 两个insert函数实现功能区别