ghblk 2023-05-08 13:16 采纳率: 85.7%
浏览 45
已结题

有关于C语言指针的问题

img

#include<stdio.h>
#include<string.h>
char * InsertStr(char * s,int pos,char * t)
{
    int  i;
    char *n=s;
    for (i = strlen(s); i >= pos - 1; i--)
        n[i + strlen(t)] = s[i];
    for (i = 0; i < strlen(t); i++)
        n[pos - 1 + i] = t[i];
    return n;
}
int main() 
{
    char a[500],b[500];
    int pos;
    scanf("%s%s%d",a,b,&pos);
    puts(InsertStr(a,pos,b));
    return 0;
}


#include<stdio.h>
#include<string.h>
char n[1000];
char *InsertStr(char *s,int pos,char *t)
{
    int i,j;
    for(i=0;i<pos-1;i++)
    {
        n[i]=s[i];
    }
    int e=i;
    for(j=0;j<strlen(t);j++)
    {
        n[e++]=t[j];
    }
    for(i=pos-1;i<strlen(s);i++)
    {
        n[e++]=s[i];
    }
    n[e]=NULL;
    return n;
}
int main() 
{
    char a[500],b[500];
    int pos;
    gets(a);
    gets(b);
    scanf("%d",&pos);
    puts(InsertStr(a,pos,b));
    return 0;
}

#include<stdio.h>
#include<string.h>
#include<malloc.h>
char *InsertStr(char *s,int pos,char *t)
{
    int i,j;
    char *n=(char *)malloc(1000*sizeof(char));
    for(i=0;i<pos-1;i++)
    {
        n[i]=s[i];
    }
    int e=i;
    for(j=0;j<strlen(t);j++)
    {
        n[e++]=t[j];
    }
    for(i=pos-1;i<strlen(s);i++)
    {
        n[e++]=s[i];
    }
    n[e]=NULL;
    return n;
}
int main() 
{
    char a[500],b[500];
    int pos;
    gets(a);
    gets(b);
    scanf("%d",&pos);
    puts(InsertStr(a,pos,b));
    return 0;
}



#include<stdio.h>
#include<string.h>
char *InsertStr(char *s,int pos,char *t)
{
    int i,j;
    char *n=s;
    for(i=0;i<pos-1;i++)
    {
        n[i]=s[i];
    }
    int e=i;
    for(j=0;j<strlen(t);j++)
    {
        n[e++]=t[j];
    }
    for(i=pos-1;i<strlen(s);i++)
    {
        n[e++]=s[i];
    }
    n[e]=NULL;
    return n;
}
int main() 
{
    char a[500],b[500];
    int pos;
    gets(a);
    gets(b);
    scanf("%d",&pos);
    puts(InsertStr(a,pos,b));
    return 0;
}



这四段代码前两段能够通过,后两个不能通过。想问一下后两个代码有什么问题?

  • 写回答

5条回答 默认 最新

  • 语言-逆行者 2023-05-08 13:47
    关注

    我修改给你

    第三段:
    在为新字符串 n 分配内存空间时,只分配了 1000 个字节的空间,这可能不足以容纳插入后的字符串。如果输入的原字符串 s 较长,插入的字符串 t 也较长,就会导致 n 的空间不够用,从而发生内存访问错误。

    因此,建议动态地分配足够多的内存空间给 n。此外,在最后还需要将 n 在结尾处加上一个空字符 '\0',表示字符串结束,否则输出的结果可能会出现错误。

    img

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h> // 动态内存分配需要包含该头文件
    
    char* InsertStr(char* s, int pos, char* t) {
        int i, j;
        int slen = strlen(s);
        int tlen = strlen(t);
        char* n = (char*)malloc(sizeof(char) * (slen + tlen + 1)); // 动态分配足够的内存空间
        for(i = 0; i < pos-1; i++) { // 将原字符串中 [0, pos-2] 的部分复制到新字符串
            n[i] = s[i];
        }
        for(j = 0; j < tlen; j++) { // 将待插入字符串 t 插入到新字符串的相应位置
            n[i+j] = t[j];
        }
        for(; i < slen; i++) { // 将原字符串中 [pos-1, slen-1] 的部分复制到新字符串
            n[i+tlen] = s[i];
        }
        n[slen+tlen] = '\0'; // 在结尾处添加空字符 '\0'
        return n;
    }
    
    int main() {
        char s[500], t[500];
        int pos;
        gets(s);
        gets(t);
        scanf("%d", &pos);
        char* res = InsertStr(s, pos, t);
        puts(res);
        free(res); // 记得释放动态分配的内存
        return 0;
    }
    
    
    

    第四个:
    在将原字符串赋值给 n 时,只是将指针 n 指向了 s,并没有单独为 n 分配内存空间。这样的话,在修改 n 的同时也会影响到原字符串 s,可能造成不可预料的后果。

    因此,建议动态地为新字符串 n 分配内存空间,并使用 strcpy() 函数复制原字符串 s 的内容到 n 中,以避免对原字符串的影响。

    img

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char* InsertStr(char* s, int pos, char* t) {
        int slen = strlen(s);
        int tlen = strlen(t);
        char* n = (char*)malloc(sizeof(char) * (slen + tlen + 1));
        strcpy(n, s); // 复制原字符串到新字符串中
        for(int i = pos-1, j = 0; j < tlen; i++, j++) {
            n[i+tlen] = n[i]; // 将原字符串 [pos-1, slen-1] 的部分向后移 tlen 个位置
            n[i] = t[j]; // 将待插入字符串 t 插入到新字符串的相应位置
        }
        n[slen+tlen] = '\0'; // 在结尾处添加空字符 '\0'
        return n;
    }
    
    int main() {
        char s[500], t[500];
        int pos;
        gets(s);
        gets(t);
        scanf("%d", &pos);
        char* res = InsertStr(s, pos, t);
        puts(res);
        free(res); // 记得释放动态分配的内存
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月16日
  • 已采纳回答 5月8日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 郑州牧原测试岗值得去吗
  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢