2012-07-20 85 views
3

您好所有我有一个小问题,在C.格式化字符串在字符串C删除非法Charactors

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; 
} 
+0

'的printf( “输出”,缓冲器2);' - >'的printf( “输出:%S”,缓冲器2);' – BLUEPIXY 2012-07-21 13:22:15

回答

2

循环遍历数组,仅复制那些你接受到另一个数组字符,使用isalnum和测试-

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

感谢,工程上面固定代码。 – user1539199 2012-07-20 18:42:36

4

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

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

for (in=buffer; *in; in++) 
    if (isalnum((unsigned char)*in) || *in == '-') 
     *out++ = *in; 
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); 
} 
+0

感谢这些在我的例子中工作得很好,但我的阅读文件和处理仍然没有喜悦是有办法剪辑开始说10个字节和缓冲区的结束10个字节,因为这是什么导致我的问题来自微处理器的头垃圾。 – user1539199 2012-07-20 19:26:36