从字符串中删除空格

时间:2014-03-15 23:18:14

标签: c string removing-whitespace

我正在尝试从一个字符串复制到另一个字符串,但第二个字符串应该省略该空格。我试图通过说,如果原始字符串中的字符是空格,请不要复制它。而是复制下一个字符。但是,程序会删除空格后的所有内容。有什么想法吗?

char deleteSpaces(char phrase[256], int length){
int j, i=0;
char phrase2[length];
  for(j=0;j<length;j++){
    if(phrase[i]==' '){
        phrase2[j]=phrase[i+1];
        i++;
        }
    phrase2[j]=phrase[i];
  }

return phrase2;
}

6 个答案:

答案 0 :(得分:2)

这是一个解决方案:

void deleteSpaces(char src[], char dst[]){
   // src is supposed to be zero ended
   // dst is supposed to be large enough to hold src
  int s, d=0;
  for (s=0; src[s] != 0; s++)
    if (src[s] != ' ') {
       dst[d] = src[s];
       d++;
    }
  dst[d] = 0;
}

答案 1 :(得分:2)

首先,你要返回一个静态标签,这是错误的。 其次,如果没有空间,你不会增加'i'。 如果一行中有多个空格,您将复制空格。如果到达源头,你无法控制。

for(j = 0; j < length; j++)
{
    while (src[i] == ' ' && i < length) i++;

    if (i < length)
        dest[j] = src[i++];
    else
    {
        dest[j] = 0;
        break;
    }
}

答案 2 :(得分:1)

如前所述,您需要分配一个新字符串并返回指向它的指针。此代码有效:

char* strip (char* input)
{
    int loop;
    char *output = (char*) malloc (strlen(input));
    char *dest = output;

    if (output)
    {
        for (loop=0; loop<strlen(input); loop++)
            if (input[loop] != ' ')
                *dest++ = input[loop];

        *dest = '\0';
    }
    return output;
}

int main (void)
{
    char srcString[] = "   this is a test with spaces   at     the end   ";
    char* dstString = strip (srcString);

    printf ("source string = '%s'\n", srcString);
    printf ("  dest string = '%s'\n", dstString ? dstString : "malloc failed in strip");

    free (dstString);

    return 0;
}

输出:

source string = '   this is a test with spaces   at     the end   '
  dest string = 'thisisatestwithspacesattheend'

它接受输入字符串并分配一个安全的相同大小的目标字符串,尽管浪费了几个字节。

方法很简单;如果不是空格,则只复制一个字符。复制完所有字符后,我在末尾写下终结符并返回指针。

答案 3 :(得分:1)

我的解决方案。选择参数及其顺序以匹配strncpy()

#include <ctype.h>

char *strip_whitespace(char *dest, const char *src, size_t n)
{
    char *s, *d;

    /* 
     * Copy 'src' to 'dest', omitting whitespace and making sure we don't
     * overflow 'dest'.
     */
    for(s=src, d=dest; *s && (d-dest)<n; s++) {
        if( !isspace(*s) ) {
            *d = *s;
            d++;
        }
    }

    /* Ensure that dest is NUL terminated in any event */
    if( d-dest < n ) {
        *d = '\0';
    } else {
        dest[n-1] = '\0';
    }

    return dest;
}

答案 4 :(得分:1)

****你在做什么**如果原始字符串中的字符是空格,请不要复制它。而是复制下一个字符。 不是一个好主意,因为

案例1。当存在多个空格时,它只会丢弃第一个空格并复制第二个空格......

案例2:您的程序只在找到空格后复制字符串,它只是跳过不以空格开头的字符串的第一个单词。

案例3。您只返回由phrase2 [0]指向的字符,因为返回类型为char,并且局部变量的范围仅限于该函数....

//the corrected programme

int deleteSpaces(char phrase[256],charphrase2[256])
{
    int i,j;
    i=j=0;
    while(phrase[i]!=NULL){
        if(phrase[i]!=' '){
            phrase2[j]=phrase[i];
            j++;
         }
       i++;
     }//end while
     phrase2[j]=phrase[i] //nulcharceter copied

     return 0;
}//end deleteSpaces function

答案 5 :(得分:1)

我用这个:

 char input[100], foreval[100];
 for(i=0;i<strlen(input);i++){
    if(isspace(input[i])){
        continue;
    }
    strncat(foreval,&input[i],1);
}