使用指针从字符串中删除空格

时间:2015-06-24 20:10:59

标签: c string pointers

#include<stdio.h>

int main()
{
    unsigned int n=0;
    char str[100];
    char *ptr,*ptr1;    
    printf("Enter the string = ");
    gets(str);
    ptr = &str[0];
    while(*ptr!='\0')
    {
        n++;ptr++;
    }
    ptr=&str[0];
    while(*ptr!='\0')
    {
        if(*ptr==' ')
        {
            n--;
            for(ptr1=++ptr;*ptr1!='\0';ptr1++)
            {
                *ptr=*ptr1;
                 ptr++;
            }   
            ptr=&str[0];    
        }
        ptr++;
    }
    printf("Modified string = ");
    for(int i=0;i<n;i++)
    {
        printf("%c",str[i]);
    }
    return 0;
}

我知道从字符串中删除空格的另一种方法,但是我想用指针来做这件事,但我不知道这段代码有什么问题?

我真的很感激一些帮助。

2 个答案:

答案 0 :(得分:4)

iharob确定了你的问题,并给出了一个很好的解决方案,但我想向你展示一个稍微不同的方法。

SecureRandom r = new SecureRandom();
byte[] ivBytes = new byte[16];
r.nextBytes(ivBytes);

cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(ivBytes));

使用测试字符串char *rd; // "read" pointer char *wr; // "write" pointer rd = wr = string; // initially, both read and write pointers point to // beginning of the string while ( *rd != 0 ) // while not at end of string { while ( isspace( *rd ) ) // while rd points to a whitespace character rd++; // advance rd *wr++ = *rd++; // copy *rd to *wr, advance both pointers } *wr = 0; // terminate the result printf( "squished: %s\n", string ); 完成此操作后,我们从以下开始("This is a test"表示字符串终结符):

\0

前四个字符不是空白,所以我们只是用相同的值覆盖这些字符并推进两个指针,给我们

+----------------------- rd
|
V
This    is a   test\0
^
|
+----------------------- wr

由于 +------------------- rd | V This is a test\0 ^ | +------------------- wr 指向空格,我们继续前进,直到找到非空格字符:

rd

然后我们将非空格字符写入 +--------------- rd | V This is a test\0 ^ | +------------------- wr 指向的位置:

wr

保持这种状态,直到我们找到下一个空格字符:

        +--------------- rd
        |
        V
Thisi   is a   test\0
    ^
    |
    +------------------- wr

继续将 +------------- rd | V Thisis is a test\0 ^ | +----------------- wr 推进到下一个非空白字符:

rd

将其写入 +------------ rd | V Thisis is a test\0 ^ | +----------------- wr

wr

泡沫,冲洗,重复:

           +------------ rd
           |
           V
Thisisa is a   test\0
      ^
      |
      +----------------- wr

+---- rd | V Thisisatesta test\0 ^ | +------------ wr 现在指向字符串的结尾。我们退出主循环并将rd写入0以终止字符串:

wr

我更喜欢这种解决方案,因为每个角色只会移动一次到最终位置。你最终会在字符串的开头覆盖你不需要的字符,但我认为这是一个合理的权衡。

修改

Chux的版本有点流畅,绝对更符合C的精神:

                   +---- rd
                   |
                   V
Thisisatest\0  test\0
           ^
           |
           +------------ wr

同样,每个角色只会移动一次到最终位置。

答案 1 :(得分:1)

有两个问题

  1. 在这一行

    for(ptr1 = ++ptr ; *ptr1 != '\0' ; ptr1++)
    

    因为你增加了ptr,因此ptr1ptr指向同一个地方,所以你实际上是将字符复制到同一个地方,而不是{{1}应该指向ptr1ptr + 1不应该被修改。

  2. 您也可以在&#34; 移动&#34;之后开始字符串的开始。从正确的一个地方到左边的所有字符,这里

    ptr

    在移动字符的循环之后,您应该保存先前的位置并指向它,这样会更有效。

  3. 我修复了您的代码,以下代码正常运行

    ptr = &str[0];