删除字符串C中的非法字符

时间:2012-07-20 18:28:52

标签: c string format

大家好我在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; 
} 

3 个答案:

答案 0 :(得分:4)

将数据从现有字符串复制到新字符串通常最简单,只需保留您想要的数据:

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

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

答案 1 :(得分:2)

循环遍历数组,并使用isalnum并测试-,仅将您接受的字符复制到另一个数组中:

char tmpBuffer[1000];
for (i = 0, j = 0; i < 1000; i++)
{
    if (isalnum(buffer[i]) || (buffer[i] == '-'))
           tmpBuffer[j++] = buffer[i];
}

答案 2 :(得分:0)

修改函数is_valid(),使其返回所需字符的真值(非零),并为不需要的字符返回false值(零)。我检查了字符是空格还是可打印的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);
}