49

Cで文字列からスペースを削除する最も簡単で効率的な方法は何ですか?

4

16 に答える 16

100

最も簡単で最も効率的なものは、通常一緒にはなりません…</p>

インプレース削除の可能な解決策は次のとおりです。

void remove_spaces(char* s) {
    char* d = s;
    do {
        while (*d == ' ') {
            ++d;
        }
    } while (*s++ = *d++);
}
于 2009-11-13T00:11:23.447 に答える
19

これは非常にコンパクトですが、完全に正しいバージョンです。

do while(isspace(*s)) s++; while(*d++ = *s++);

そしてここに、私の娯楽として、完全に正しいとは言えず、コメンテーターを動揺させるコードでゴルフされたバージョンがあります。

未定義の動作が発生する可能性があり、空の文字列がまったくない場合は、本文を削除できます。

while(*(d+=!isspace(*s++)) = *s);

一体、スペースがスペース文字だけを意味する場合:

while(*(d+=*s++!=' ')=*s);

それを本番環境で使用しないでください:)

于 2009-11-13T00:30:31.087 に答える
9

C では、一部の文字列をその場で置き換えることができます。たとえば、strdup() によって返される文字列です。

char *str = strdup(" a b c ");

char *write = str, *read = str;
do {
   if (*read != ' ')
       *write++ = *read;
} while (*read++);

printf("%s\n", str);

コード内で宣言されたものなど、その他の文字列は読み取り専用です。それらを新しく割り当てられたメモリ領域にコピーし、スペースをスキップしてコピーを埋める必要があります。

char *oldstr = " a b c ";

char *newstr = malloc(strlen(oldstr)+1);
char *np = newstr, *op = oldstr;
do {
   if (*op != ' ')
       *np++ = *op;
} while (*op++);

printf("%s\n", newstr);

人々が他の言語を発明した理由がわかります ;)

于 2009-11-13T00:18:16.680 に答える
2
#include <ctype>

char * remove_spaces(char * source, char * target)
{
     while(*source++ && *target)
     {
        if (!isspace(*source)) 
             *target++ = *source;
     }
     return target;
}

ノート;

  • これは Unicode を処理しません。
于 2009-11-13T00:12:57.750 に答える
0

zString ライブラリから取得したコード

/* search for character 's' */
int zstring_search_chr(char *token,char s){
        if (!token || s=='\0')
        return 0;

    for (;*token; token++)
        if (*token == s)
            return 1;

    return 0;
}

char *zstring_remove_chr(char *str,const char *bad) {
    char *src = str , *dst = str;

    /* validate input */
    if (!(str && bad))
        return NULL;

    while(*src)
        if(zstring_search_chr(bad,*src))
            src++;
        else
            *dst++ = *src++;  /* assign first, then incement */

    *dst='\0';
    return str;
}

コード例

  Exmaple Usage
      char s[]="this is a trial string to test the function.";
      char *d=" .";
      printf("%s\n",zstring_remove_chr(s,d));

  Example Output
      thisisatrialstringtotestthefunction

zString コードをよく読んでください。役に立つかもしれません https://github.com/fnoyanisi/zString

于 2016-02-18T23:46:35.377 に答える
0

それは私が考えることができる最も簡単です(テスト済み)そしてそれはうまくいきます!!

char message[50];
fgets(message, 50, stdin);
for( i = 0, j = 0; i < strlen(message); i++){
        message[i-j] = message[i];
        if(message[i] == ' ')
            j++;
}
message[i] = '\0';
于 2016-12-26T07:30:29.480 に答える
-1

C 文字列は固定メモリにあると想定しているため、スペースを置き換える場合はすべての文字をシフトする必要があります。

最も簡単な方法は、新しい文字列を作成して元の文字列を反復処理し、スペース以外の文字のみをコピーすることです。

于 2009-11-13T00:14:23.473 に答える