Cで文字列からスペースを削除する最も簡単で効率的な方法は何ですか?
16 に答える
最も簡単で最も効率的なものは、通常一緒にはなりません…</p>
インプレース削除の可能な解決策は次のとおりです。
void remove_spaces(char* s) {
char* d = s;
do {
while (*d == ' ') {
++d;
}
} while (*s++ = *d++);
}
これは非常にコンパクトですが、完全に正しいバージョンです。
do while(isspace(*s)) s++; while(*d++ = *s++);
そしてここに、私の娯楽として、完全に正しいとは言えず、コメンテーターを動揺させるコードでゴルフされたバージョンがあります。
未定義の動作が発生する可能性があり、空の文字列がまったくない場合は、本文を削除できます。
while(*(d+=!isspace(*s++)) = *s);
一体、スペースがスペース文字だけを意味する場合:
while(*(d+=*s++!=' ')=*s);
それを本番環境で使用しないでください:)
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);
人々が他の言語を発明した理由がわかります ;)
#include <ctype>
char * remove_spaces(char * source, char * target)
{
while(*source++ && *target)
{
if (!isspace(*source))
*target++ = *source;
}
return target;
}
ノート;
- これは Unicode を処理しません。
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
それは私が考えることができる最も簡単です(テスト済み)そしてそれはうまくいきます!!
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';
C 文字列は固定メモリにあると想定しているため、スペースを置き換える場合はすべての文字をシフトする必要があります。
最も簡単な方法は、新しい文字列を作成して元の文字列を反復処理し、スペース以外の文字のみをコピーすることです。