下面的代码应返回一个仅包含用户输入的字符串中的数字的字符串。
另外,返回的字符串应将数字分为三个数字,并在数字之间加上'-'。
一切正常,代码编译没有任何错误,但是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;
}
答案 0 :(得分:1)
此代码段
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
答案 1 :(得分:0)
首先为result
分配内存,然后在下一行result=answer;
中立即将其指向其他位置,从而导致内存泄漏,而不是指向局部变量。这是错误。