簡體   English   中英

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

[英]How to remove spaces that are in a string sentence

我正在嘗試編寫代碼以刪除所有開頭,結尾和中間的句子空間,但在單詞之間僅保留一個空格。

例如,如果輸入是

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

如果有人可以提出一些想法,我將不勝感激,謝謝。

使用兩個指針。 第一個指向要讀取的下一個字符,第二個指向要寫入的位置。

如果您連續讀取兩個空格,請不要前進寫入指針。


您可能要考慮的另一種方法是將strtok" "用作分隔符。

您可以有兩個數組和兩個計數器。 每次迭代總是增加第一個計數器,但是只有當字符不是空格時才增加第二個計數器。 它的表看起來像這樣。

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

您可以在第一個實例中使用字符串標記器,並使用空白符(“”)作為定界符。 為此,在C語言中使用strtok,然后解析strtok函數的輸出,對於每個元素,如果它包含更多的空白字符,則將其消除。 同樣,您將每個更正后的元素放在另一個數組中。 然后,您要做的就是解析新數組,並在每個元素之后添加一個空格。 如果您喜歡這個想法,我可以為您提供代碼草案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM