strcpy赋值问题

#include
#include
char *remove_digits(const char *str,char *result)
{    
    int i=0;
//    const char result[99];
// char result[99];
 while (*str != '\0')
 {
  while (*str > '0' && *str <= '9')
  {
   strcpy(str, str + 1);
   //strcpy(result,str );
  }
  str++;
 }
  //*result=*(str+1);
  //strcpy(result,str);
  for(i=0;i<=99;i++)
  {
      strcpy(result+i,str+i );
          
  }
//return result;
 
}
int main()
{
    
    char a[99];
    char b[99];
    gets(a);
    //scanf("%s",&a);
    remove_digits(a,b);
    printf("结果为:%s\n",a);
    printf("结果为:%s\n",b);
                
        
        
    
 
 return 0;
}

img

 C:\Users\Administrator\Desktop\main.exe                                                                                                                       X
   8w8d
      asudd
              after 8.407 seconds with return value 0

用指针去除字符串里的数字,result用于输出结果,但是我用strcpy给result赋值始终赋值不上,求解,问题出在哪了

可以在函数remove_digits()中定义一个字符数组复制str指向的字符串,然后去除这个备份的字符串里面的数字字符,然后将其结果复制到result指向的位置即可。

修改如下:

参考链接:


#include<stdio.h>
#include<string.h>
char *remove_digits(const char *str,char *result) {
    int i=0;
//    const char result[99];
// char result[99];
    char arr[99];
    char *temp=arr; 
    
    // https://blog.csdn.net/m0_52399461/article/details/121114798 
    strcpy(temp,str); // 因为str为指向常量的常量指针,所以复制其值到字符指针temp指向的数组,然后进行删除字符的操作 
    while (*temp != '\0') {
        while (*temp > ='0' && *temp <= '9') {  //加上一个等于,让数字字符'0'也可以去除
            strcpy(temp, temp + 1);
            //strcpy(result,str );
        }
        temp++;
    }
    
    // 将存储了删除字符后结果的字符串复制到字符指针result指向的字符数组 
    strcpy(result,arr);
    //*result=*(str+1);
    //strcpy(result,str);
//    for(i=0; i<=99; i++) {
//        strcpy(result+i,str+i );
//
//    }
    return result;

}
int main() {

    char a[99];
    char b[99];
    gets(a);
    //scanf("%s",&a);
    char *s =remove_digits(a,b);
    printf("结果为:%s\n",a);
    printf("结果为:%s\n",b);
//    printf("结果为:%s\n",s);





    return 0;
}


img

博主您好,
在这段代码中,问题出在函数remove_digits中的result参数是一个指针类型的形参,需要在函数内部分配内存空间,以存储处理后的结果。你的代码中没有为result分配内存,因此strcpy函数无法将结果复制到result所指向的内存地址中。

你可以使用malloc函数在函数内部分配一定大小的内存空间,然后将处理后的结果存储在这个内存空间中,并在函数结束时返回这个指针。

以下是修改后的代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *remove_digits(const char *str)
{
    int i = 0;
    char *result = malloc(strlen(str) + 1);  // 分配内存空间
    if (!result) {
        printf("内存分配失败\n");
        return NULL;
    }
    while (*str != '\0') {
        if (*str < '0' || *str > '9') {
            result[i++] = *str;
        }
        str++;
    }
    result[i] = '\0';
    return result;
}

int main()
{
    char a[99];
    char *b;
    gets(a);
    b = remove_digits(a);
    printf("结果为:%s\n", a);
    printf("结果为:%s\n", b);
    free(b);  // 释放内存空间
    return 0;
}


在函数remove_digits中,首先使用malloc函数为result分配了一个长度为strlen(str)+1的内存空间,保证了空间大小的足够。然后在函数中将处理后的结果存储在这个内存空间中,并在函数结束时返回了指向这个内存空间的指针。

在main函数中,将返回的指针赋值给了变量b,然后输出结果后再使用free函数释放了分配的内存空间,避免内存泄漏。

用没用同时保留str和result 的办法,就是char *remove_digits(const char *str,char *result)这个不动

你的算法效率比较低

#include<stdio.h>
#include<string.h>
#include <iostream>
using namespace std;
char* remove_digits(char* str, char* result)
{
    if(str==nullptr)
        return nullptr;
    char* p1,*p2;
    p1=str;
    p2=result;
    while (*p1 != '\0')
    {
        if (*p1 > '0' && *p1 <= '9') {
            p1++;
        }
        else
        {
            *p2=*p1;
            p2++;
            p1++;
        }
    }          
    *p2='\0';
    cout<<result<<endl;
    return result;
}
int main()
{
    char a[99];
    char b[99];
    ::gets_s(a);
    //scanf("%s",&a);
    remove_digits(a, b);
    printf("结果为:%s\n", a);
    printf("结果为:%s\n", b);
    return 0;
}