如何删除字符串句子中的空格

时间:2011-12-11 01:03:01

标签: c

我正在尝试编写一个代码来删除句子空间的所有前导,尾随和中间,但只保留单词之间的一个空格。

例如,如果输入是

"    This    is my     string    "

输出应为

"This is my string"

到目前为止,我已经想出了这个:

#include <stdio.h>
void cascade(char str[], int i);
main()
{
    char str[100] = "    This    is my     string    ";
    int i = 0;
    while (str[i] != '\0') {
            if (str[i] == ' ' && str[i + 1] == ' ')
                    cascade(str, i);
            i++;
    }
    printf("%s\n", str);
}

void cascade(char str[], int i)
{
    while(str[i] != '\0') {
            str[i] = str[i + 1];
            i++;
    }
    str[i + 1] = '\0';
}

如果有人能提出一些想法,我将不胜感激,谢谢。

5 个答案:

答案 0 :(得分:4)

使用两个指针。第一个指向要读取的下一个字符,第二个指向要写入的位置。

如果连续读取两个空格,请不要使写指针前进。


您可能需要考虑的另一种方法是使用strtok" "作为分隔符。

答案 1 :(得分:2)

你可以有两个数组和两个计数器。每次迭代你总是增加你的第一个计数器,但只有当角色不是空格时才增加第二个计数器。它的表格看起来像这样。

  Char   In-Pos  Out-Pos

   ' '      0      0
   ' '      1      0
   ' '      2      0
   ' '      3      0
   'T'      4      0
   'h'      5      1
   'i'      6      2
   's'      7      3
   ' '      8      4
   ' '      9      5
   ' '     10      5
   ' '     11      5
   'i'     12      5
   's'     13      6
   ' '     14      7
   'm'     15      8
   'y'     16      9
   ' '     17     10
   ' '     18     11
   ' '     19     11
   ' '     20     11
   ' '     21     11
   's'     22     11
   't'     23     12
   'r'     24     13
   'i'     25     14
   'n'     26     15
   'g'     27     16
   ' '     28     17
   ' '     29     18
   ' '     30     18
   ' '     31     18

答案 2 :(得分:2)

#include <stdio.h>
#include <string.h>

char* trim(char str[]){
    char *p=str;
    char *token;
    if(str == NULL) return NULL;
    if(*str == '\0') return str;

    token=strtok(str, " \t");
    if(token == NULL){
        *str = '\0';
        return str;
    }
    while(NULL!=token){
        int len;
        len = strlen(token);
        if(p != token){
            memmove(p, token, len);
        }
        p += len;
        *p++ =' ';
        token = strtok(NULL, " \t");
    }
    p[-1]='\0';

    return str;
}

int main(){
    char str[100] = "    This    is my     string    ";
    printf("\"%s\"\n", trim(str));
    return 0;
}

答案 3 :(得分:1)

您可以在第一个实例中使用字符串标记生成器,并将空格(“”)用作分隔符。为了这个目的,你使用strtok.After你解析strtok函数的输出,并为每个元素,如果它包含更多的空格字符,你消除它们。您还将每个更正的元素放在另一个数组中。 然后,您所要做的就是解析新数组并在每个元素后面添加一个空格。如果您喜欢这个想法,我可以为您提供代码草案。

答案 4 :(得分:1)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char** split(const char *str, const char *delimiter, size_t *len){
    char *text, *p, *first, **array;
    int c;
    char** ret;

    *len = 0;
    text=strdup(str);//strdup not standard
    if(text==NULL) return NULL;
    for(c=0,p=text;NULL!=(p=strtok(p, delimiter));p=NULL, c++)//count item
        if(c==0) first=p; //first token top

    ret=(char**)malloc(sizeof(char*)*c+1);//+1 for NULL
    if(ret==NULL){
        free(text);
        return NULL;
    }
    //memmove?
    strcpy(text, str+(first-text));//skip until top token
    array=ret;
    for(p=text;NULL!=(p=strtok(p, delimiter));p=NULL){
        *array++=p;
    }
    *array=NULL;
    *len=c;
    return ret;
}

void free4split(char** sa){
    char **array=sa;

    if(sa!=NULL){
        free(array[0]);//for text
        free(sa);      //for array
    }
}

int main(void){
    char str[100] = "    This    is my     string    ";
    char **words;
    size_t len=0;
    int i;

    words = split(str, " \t", &len);
    *str = '\0';
    for(i = 0;i<len-1;++i){
        strcat(str, words[i]);
        strcat(str, " ");
    }
    strcat(str, words[i]);
    printf("\"%s\"\n", str);
    free4split(words);
    return 0;
}