2011-09-15 64 views
2
char* clean_string (char *input_string){ 
    /*Ensure that input string isn't null and only do heavy lifting if it's not null*/ 
    if (input_string){ 
    char *stripped; 
    stripped = (char*)malloc(strlen(input_string)*sizeof(char)); 
    while (*input_string != '\0'){ 
     if isalpha(*input_string){ 
     *stripped = toupper(*input_string); 
    input_string++; 
    stripped++; 
     } else { 
     input_string++; 
    } 
    } 
/*  *stripped++ += '\0';*/ 
    return stripped; 
    } 
/*default return val*/ 
return NULL; 
} 

有人可以告诉我哪里出错了吗?试图做一个测试运行,当我尝试调用它时,它不输出任何内容。从函数中返回一个字符串C

+0

你是什么意思的 “输出” 吗? – littleadv

+0

存储指针被剥离的初始值并返回该指针并取消注释该部分* stripped ++ + ='\ 0'; –

+0

尝试发布可编译代码:'if isalpha(* input_string){'不能编译! –

回答

7

您在返回一个指针到字符串中的最后一个字符(stripped++?)。
您正在分配的一个字节太少(应该是strlen(...) + 1)。

stripped = (char*)malloc(strlen(input_string)*sizeof(char)); /* Wrong. */ 
stripped = (char*)malloc(strlen(input_string) + 1); 

/* .. */ 
stripped++; 

/* .. */ 
return stripped; 

尽量保持一个副本,类似original_stripped = stripped开始改变stripped之前,并返回复制的值(不是增加一个)。

+5

+1,但'sizeof(char)'保证1,所以可以省略。 – Jon

+0

@Jonathan Leffler感谢您的编辑:-) – cnicutar

+0

非常感谢Jonathan。我知道我只是在“那里”,但在我疲惫的时候看不到我的malloc有点偏离。我想它可能是。 – diz

2

问题是与调用stripped++。您正在修改您获得的指针malloc。制作一个额外的指针char *result_char = stripped;并将其用于迭代结果字符串。

2

的问题是,你返回之前增加你的剥离变量。 尝试:

char *stripped; 
char *result; 
stripped = (char*)malloc(strlen(input_string)*sizeof(char)); 
result = stripped; 
... 
return result; 
0

如何只:

char* clean_string (char *input_string) 
    { 
     /*Ensure that input string isn't null and only do heavy lifting if it's not null*/ 
     if (input_string) 
     { 
      char *stripped; 
      int i; 

      stripped = (char*)malloc(strlen(input_string)*sizeof(char) + 1); 

      for(i=0; i < strlen(input_string); i++) 
       stripped[i] = (isalpha(input_string[i]) ? toupper(input_string[i]) : input_string[i]); 

      return stripped; 
     } 
    /*default return val*/ 


return NULL; 
} 
+1

即使'isalpha'函数调用也没用。 'toupper'功能自动检查字符是否是字母。 – Sanjeev

+0

'sizeof(char)'也是无用的(它被定义为1) –

+0

是真的,但没有开销,因为编译器在编译期间用合适的字符大小(根据体系结构)替换它。根据编译器的决定,'isalpha'将会或不会被内联。再次,代码更漂亮'sizeof(char)'(; – Sanjeev