2012-07-20 64 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