3

こんにちは、C で文字列をフォーマットする際に小さな問題があります。

char buffer[1000];

"♀ ‼☻☺ ☻ ]\[MY-TEXT"// 短縮された読み取り値を持つバッファがあります

ご覧のとおり、不正な文字が含まれているため、使用できませんsscanf。不正な文字をすべて削除し、すべての数字、文字、および-記号を保持する必要があります。

これは可能ですか?

これは私の新しいコードです

#include <stdio.h> 
#include <string.h> 
#include <windows.h> 

int main () 
{ 

    char buffer[1000]="♀ ‼☻☺ ☻ ]\[MY-TEXT";

char buffer2[1000]; 
char *in; 
char *out = buffer2; 

for (in=buffer; *in; in++) 
   if (isalnum((unsigned char)*in) || *in == '-') 
       *out++ = *in; 

printf("Output",buffer2);


 system("pause");
    return 0; 
} 
4

3 に答える 3

4

通常、既存の文字列から新しい文字列にデータをコピーするのが最も簡単ですが、必要なものだけを保持します。

char buffer2[1000];
char *in;
char *out = buffer2;

for (in=buffer; *in; in++)
   if (isalnum((unsigned char)*in) || *in == '-')
       *out++ = *in;
于 2012-07-20T18:33:42.113 に答える
2

配列をループし、受け入れる文字のみを別の配列にコピーし、次を使用isalnumしてテストし-ます。

char tmpBuffer[1000];
for (i = 0, j = 0; i < 1000; i++)
{
    if (isalnum(buffer[i]) || (buffer[i] == '-'))
           tmpBuffer[j++] = buffer[i];
}
于 2012-07-20T18:33:28.680 に答える
0

関数を変更して、is_valid()必要な文字に対して真の値 (ゼロ以外) を返し、不要な文字に対して偽の値 (ゼロ) を返すようにします。文字がスペース、または印刷可能なASCIIであることを確認しました。

#include <stdio.h>

int
is_valid(char ch)
{
    if (' ' <= ch && ch <= '~')
        return 1;
    else
        return 0;
}

void
copy_only_valid(char *out, unsigned int max_out, char const *in)
{
    if (!out || !max_out || !in)
        return;

    for (;;)
    {
        if (*in == '\0' || max_out == 1)
        {
            // When we reach the terminating NUL byte in the input string,
            // or there is only one char left in out buffer, put a NUL byte
            // and return.
            *out = '\0';
            return;
        }
        if (is_valid(*in))
        {
            *out++ = *in++;
            --max_out;
        }
        else
            ++in;
    }
}

int
main()
{
    char const *bad = "\b\nfoo\003\005bar\f\tbaz";
    char buf[128];

    copy_only_valid(buf, sizeof(buf), bad);
    puts(buf);
}
于 2012-07-20T18:47:35.017 に答える