gpt4 book ai didi

c - 从函数返回 "char pointer"时是否有任何问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:55 27 4
gpt4 key购买 nike

下面的代码应该返回一个仅包含用户输入字符串中的数字的字符串。

此外,返回的字符串应将数字分组为三位数字,并在它们之间放置一个“-”。

一切运行正常,代码编译没有任何错误,但是 char* 没有从函数返回。

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

char* phoneNo(char*);

void main(){

char str[100];
char *strpass = str;

printf("Enter the string: ");
fgets(str,100,stdin);

printf("Entered stringis: %s\n",str);

char *result = phoneNo(strpass);
printf("Returned char* is: %s\n",result);
}

char* phoneNo(char *strpass){

char str[100];
strcpy(str,strpass);
printf("Char[] in Function: %s",str);

char answer[100];
char * result;
result = ( char* ) malloc(100*sizeof(char));
result=answer;
//printf("Char* pointed to Char[]: %s\n",result);

int i=0;
int j=0;
int k=3;

while(str[i]!='\0'){

if(str[i]=='1'||str[i]=='2'||str[i]=='3'||str[i]=='4'||str[i]=='5'||str[i]=='6'||str[i]=='7'||str[i]=='8'||str[i]=='9'||str[i]=='0')
{


if(j==0){

answer[j]=str[i];
answer[j+1]='\0';
j++;
i++;
continue;
}

if(j==k){
answer[j]='-';
answer[j+1]='\0';
j++;
k+=4;
}else{
answer[j]=str[i];
answer[j+1]='\0';
j++;
i++;
}
}
else
i++;
}
printf("Char* to be returned: %s\n",result);

return (char *)result;
}

最佳答案

这段代码

char answer[100];
char * result;
result = ( char* ) malloc(100*sizeof(char));
result=answer;

有内存泄漏,因为分配的内存地址由于这条语句丢失了

result=answer;

现在指针 result 指向本地数组 answer 并从导致未定义行为的函数返回,因为退出函数后数组将不存在。

使用分配的动态数组代替本地数组进行处理answer

注意那个而不是这个复合if语句

if(str[i]=='1'||str[i]=='2'||str[i]=='3'||str[i]=='4'||str[i]=='5'||str[i]=='6'||str[i]=='7'||str[i]=='8'||str[i]=='9'||str[i]=='0')

这样写就好多了

if ( isdigit( ( unsigned char )str[i] ) )

函数声明如下

char* phoneNo(const char *strpass);

即它的参数必须有限定符const

我会按照演示程序中显示的以下方式编写函数。

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

char * phoneNo( const char *s )
{
const size_t GROUP_SIZE = 3;

size_t digits_count = 0;

for ( const char *p = s; *p; ++p )
{
if ( isdigit( ( unsigned char )*p ) ) ++digits_count;
}

char *result = malloc( digits_count + digits_count / GROUP_SIZE + sizeof( ( char )'\0' ) );

size_t i = 0;

for ( size_t k = 0; *s; ++s )
{
if ( isdigit( ( unsigned char )*s ) )
{
if ( k == GROUP_SIZE )
{
if ( i != 0 )
{
result[i++] = '-';
}
k = 0;
}

result[i++] = *s;
++k;
}
}

result[i] = '\0';

return result;
}

int main(void)
{
const char *s = "123456789";

char *result = phoneNo( s );

puts( result );

free( result );

s = "12\t34567\t89";

result = phoneNo( s );

puts( result );

free( result );

return 0;
}

程序输出为

123-456-789
123-456-789

关于c - 从函数返回 "char pointer"时是否有任何问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374898/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com