我正在编写一个方法来从作为指向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
方法打印的相同字符串?
答案 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!