2011-12-11 27 views
1

文章スペースの先頭、末尾、中間をすべて削除するが、単語間にはスペースを1つだけ残すコードを作成しようとしています。例えば文字列内にある空白を削除する方法

入力は出力が

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

いくつかのアイデアを思いついた、ありがとう。

+0

あなたは文字列関数を使用することを許可していますか? –

+0

はい、string.hライブラリを使用できます。 – scott

+0

"単語"はどのように定義しますか?あなたの "言葉"にタブ、改行、またはその他の空白文字が含まれているとどうなりますか? –

答えて

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

Awsomeee、これです。わかりやすくするために、私はあなたの関数を少し圧縮して、新しいことをcに慣れている人には分かりやすくしました。ありがとうございます – scott

4

2つのポインタを使用します。読み込む次の文字の最初の点と、書き込む場所の2番目の点。

2つのスペースを連続して読み取る場合は、書き込みポインタを前進させないでください。


あなたは検討する必要があります別のアプローチは、区切り文字として" "strtokを使用することです。

+0

これは素晴らしい回答ですが、これは[タグ:宿題]の質問です。あなたが完全な答えを出すなら、何がポイントですか? – FakeRainBrigand

+0

これは非常にいい答えですが、私はBLUEPIXYがコードを書くのと同じ方法を使ったと思います。とにかくありがとう – scott

2

2つの配列と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 
+0

私はテーブルをうまくいってもっと明確に変更しました。アイデアは、あなたがスペースを見つけたらイン・ポジを除いて何も変えないということです。開始時には、有効な文字(たとえば 'T')が得られるまで、出力に何も設定されません。結局、私たちは決して最後のスペースを設定しませんでした。 – FakeRainBrigand

+0

NULが最後の文字であることを忘れないでください。また、文字列の最後にスペースを入れてはいけません。良いアイデアですが、 "文字列の最後か冒頭に空白がない"とすると、それがより複雑になります。 –

+0

これは非常に興味深い解決策ですが、私はちょうどcを学び始めて以来、私にはエントリーレベルの方法ではないと思います。しかし、ありがとうございました – scott

1

文字列トークナイザを最初のインスタンスで使用し、区切り文字として空白( "")を使用できます。その目的のために、strtok関数を使い、strtok関数の出力を解析した後、各要素に対して、より多くの空白文字が含まれている場合はそれらを削除します。また、修正された各要素を別の配列に入れます。 次に、新しい配列を解析し、すべての要素の後に空白を追加するだけです。あなたがこのアイデアを好きなら、私はあなたのためのコードドラフトを提供することができます。

+0

あなたの提案をありがとう、私はBLUEPIXYは同じメソッドを使用していると思う、彼はstrtok関数も使用しました。ありがとうございます – scott

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

うわーありがとうございました。この努力のために大変ありがとうございます。それは完璧にうまくいきます。また、非常に便利なstrtok関数を使用していると思います。またBLUEPIXYなどのポインタを使用すると多くの助けになりました。しかし、それほど複雑ではないのであれば、それは良いことではないでしょうか?しかし、それだけでうまく動作し、この場合の問題です、ありがとう – scott

関連する問題