繁体   English   中英

从字符串中删除空格

[英]Removing spaces from a string

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

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;
}

这是一个解决方案:

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;
}

首先,您要返回一个静态选项卡,这是错误的。 其次,如果没有空间,则不要递增“ 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;
    }
}

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

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'

它占用了输入字符串,并为目标字符串分配了安全的大小,尽管浪费了一些字节。

方法很简单; 如果不是空格,则仅复制字符。 复制完所有字符后,我将结束符写在最后并返回指针。

我的解决方案。 选择参数及其顺序以匹配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;
}

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

情况1。当存在多个空格时,它只是丢弃第一个空格并复制第二个空格...

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

情况3。由于返回类型为char,因此仅返回由statement2 [0]指向的字符,并且局部变量的范围仅限于该函数。

//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

我用这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM