更改传递给void函数的String的值

时间:2016-02-18 15:15:36

标签: c string

我正在编写一个方法来从作为指向void函数的指针传递的String中删除空格,如下所示 -

char *  mystrcpy(char * dest, char * str) {
    dest = malloc(sizeof(str));
    char * tep = dest;
    while(*dest++ = *str++) {

    }
    return tep;
}

void trimWhiteSpace(char * str){

    int counter = 0;
    int i = 0;

    char * res = malloc(sizeof(str));
    for(i = 0; str[i]; i++) {
        if(str[i] != ' ')
            res[counter++] = str[i];
    }
    res[counter] = '\0';


    mystrcpy(str, res);
    printf("I got %s\n", str);
}

然而,当我尝试使用main -

测试我的方法时
int main() {
    char * myStr = (char*)malloc(sizeof(char) * 50);
    myStr = "Hello    World   !  ";
    trimWhiteSpace(myStr);
    printf("%s", myStr);
    return 0;
}

程序打印

  

“的HelloWorld!”

void trimWhiteSpace(char * str)方法的内部,但不是主打印未修改字符串的情况。

如何确保main方法打印出trimWhiteSpace方法打印的相同字符串?

1 个答案:

答案 0 :(得分:0)

您的程序以内存泄漏开始。:))

int main() {
    char * myStr = (char*)malloc(sizeof(char) * 50);
    myStr = "Hello    World   !  ";
    //...

首先,您分配了内存并将其地址分配给指针myStr

    char * myStr = (char*)malloc(sizeof(char) * 50);

并在下一个语句中使用字符串文字的地址重新指定了指针

    myStr = "Hello    World   !  ";

考虑到字符串文字在C和C ++中是不可变的。任何修改字符串文字的尝试都会导致未定义的行为。

您应该使用标准C函数strcpy来复制已分配内存中的字符串文字。

strcpy( myStr, "Hello    World   !  " );

或其他错误。您正在使用应用于指针的运算符sizeof

char *  mystrcpy(char * dest, char * str) {
    dest = malloc(sizeof(str));
                  ^^^^^^^^^^^

通常sizeof( char * )等于4或8,具体取决于编译程序的环境。

您应该使用另一个标准C函数strlen。例如

char *  mystrcpy(char * dest, char * str) {
    dest = malloc( strlen( str ) + 1);

程序中还有其他错误。

然而,删除空格的功能可以写得更简单。

这是一个示范程序

#include <stdio.h>

char * trimWhiteSpace( char * str )
{ 
    char *q = str; 
    char c = ' ';

    while ( *q && *q != c ) ++q; 

    char *p = q; 

    while ( *q ) 
    { 
        if ( *++q != c ) *p++ = *q; 
    } 

    return str; 
} 

int main( void ) 
{
    char myStr[] = "Hello    World   !  ";

    puts( myStr );
    puts( trimWhiteSpace( myStr ) );
}    

它的输出是

Hello    World   !  
HelloWorld!