Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中删除字符串中的多余空格_C_Whitespace - Fatal编程技术网

如何在C中删除字符串中的多余空格

如何在C中删除字符串中的多余空格,c,whitespace,C,Whitespace,我有一个包含额外空格字符串的字符串,例如: char * s = " foo baa "; 我想把它转换为: foobaa 我编写了这个函数: void trim (char ** src) { char * p = strdup(* src); char * ret = malloc(strlen(*src) + 1); assert(ret != NULL); char * toke

我有一个包含额外空格字符串的字符串,例如:

char * s = "  foo    baa       ";
我想把它转换为:

foobaa

我编写了这个函数:

void trim (char ** src)
    {
        char * p = strdup(* src);
        char * ret = malloc(strlen(*src) + 1);
                assert(ret != NULL);
        char * token;
        token = strtok(p, " \t");
        while( NULL != token ) {
            while (*token) {
                 *(ret ++) = *(token ++);
            }
            token = strtok(NULL, " \t");
        }

        printf("ret = %s\n", ret);
    }

但它给了我一个来自
ret
变量值的空字符串。有人会指出我的错误吗?提前谢谢

如果您正在递增
ret
,请存储原始地址或使用下标访问
ret
的不同字符

    // snip
    char * ret = malloc(strlen(*src) + 1);
            assert(ret != NULL);
    char * ret_start = ret;
    //snap
    printf("ret_start = %s\n", ret_start);

您正在递增
ret
,在您的while中,存储原始地址或使用下标访问
ret
的不同字符

    // snip
    char * ret = malloc(strlen(*src) + 1);
            assert(ret != NULL);
    char * ret_start = ret;
    //snap
    printf("ret_start = %s\n", ret_start);

c++中的其他简单解决方案(可以很容易地更改为c代码)---:)

<> >初始<代码>计数=0 < /COD> >代码> STR > > C++字符串

for(i=0;i< str.size();i++)
{
        if(str[i]!=' ')
        {
                str[j++]=str[i];
                count=0;
        }
        else if(str[i]==' '&&count==0)
        {
                str[j++]=str[i];
                count =1;
        }
}
for(i=0;i
c++中的其他简单解决方案(可以轻松更改为c代码)---:)

<> >初始<代码>计数=0 < /COD> >代码> STR > > C++字符串

for(i=0;i< str.size();i++)
{
        if(str[i]!=' ')
        {
                str[j++]=str[i];
                count=0;
        }
        else if(str[i]==' '&&count==0)
        {
                str[j++]=str[i];
                count =1;
        }
}
for(i=0;i
+1。循环结束后,
ret
指向终止的空字符。谢谢!很好。你有改进这段C代码的小贴士吗?有三点-可能没那么重要,但不管怎样:1。将
src
作为
char*
传递为什么需要它作为
char**
(但请看前面的#3)?2.为什么需要
p
?您可以在
src
3上执行strtok。将
src
声明为const char*`,无论如何都不应该在方法中修改它。@Binyamin:about#2:如果目的是不应该修改它,那么在传入的字符串上使用
strtok()
不是一个好主意,因为
strtok()
会将
'\0'
字符放到它传递的字符串中。+1。循环结束后,
ret
指向终止的空字符。谢谢!很好。你有改进这段C代码的小贴士吗?有三点-可能没那么重要,但不管怎样:1。将
src
作为
char*
传递为什么需要它作为
char**
(但请看前面的#3)?2.为什么需要
p
?您可以在
src
3上执行strtok。将
src
声明为const char*`,无论如何都不应该在方法中修改它。@Binyamin:about#2:如果目的是不应该修改它,那么在传入的字符串上使用
strtok()
不是一个好主意,因为
strtok()
会将
'\0'
字符放到传入的字符串中。