Cの文字列からアルファベット以外の記号を削除する方法があるかどうかを教えてください。
たとえば、私はchar array[5][5]
withを持っています:"hi", "my..", "name", "is,,", "bob!"
必要な出力:"hi", "my", "name", "is", "bob"
とにかくシンボルを削除することはありますか?
これは非常に単純な実装です。
void keepalnum(char *src) {
unsigned char *dest = src;
while ((*dest = *src++))
dest += isalnum(*dest) ? 1 : 0;
}
アイデアは、各コピーの後にソースポインターを進めることですが、英数字が表示された場合にのみ宛先ポインターを移動します。
使用方法は次のとおりです。
char str[] = "quick-brown fox jumps? over the.. lazy dog!";
keepalnum(str);
printf("%s\n", str);
このプリント
quickbrownfoxjumpsoverthelazydog
Cisalnum(int ch);
を使用すると、次のように数字でも文字でもないフィルター値を削除できます。
#include <stdio.h>
#include <string.h>
#define ARRAY_LEN 5
#define STR_LEN 5
int main(int argc, char *argv[])
{
int rc = 0;
char array[5][5];
char out_str[5] = {0};
int array_idx, str_idx, cpy_idx;
strcpy(array[0], "hi");
strcpy(array[1], "my..");
strcpy(array[2], "name");
strcpy(array[3], "is,,");
strcpy(array[4], "bob!");
for(array_idx=0; array_idx < ARRAY_LEN; array_idx++)
{
cpy_idx = 0;
for(str_idx=0; str_idx < STR_LEN; str_idx++)
{
if(isalnum(array[array_idx][str_idx]))
{
out_str[cpy_idx++]= array[array_idx][str_idx];
}
}
out_str[cpy_idx++] = '\0';
printf("%s ", out_str);
}
printf("\n");
return rc;
}
この例は、4文字の文字列と終了0を中心にコーディングされているため、終了境界チェックがありません。実際には、処理する予定の最大の文字列よりも大きいバッファーを宣言しますが、コピーされる文字をカウントします。ここでは行われませんでした。