2014-01-29 201 views
0

我試圖寫一個代碼,要求用戶輸入一個字符串,並採取除字母以外的所有字符。刪除一個字符串的字符

現在我自己做了,它似乎不能正常工作。我是新來的字符串,所以我試圖理解和掌握字符串。我試圖在Mac上使用gdb,但我沒有所有的功能來理解這一點。 你能幫忙嗎?

什麼代碼必須做到:(例如)用戶輸入:h**#el(l)o&^w

和輸出hello.

這裏是我的代碼:

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

int main() 
{ 
    char string[100]; 
    int i; 
    int seen = 0; 

    printf("Enter String: "); 
    scanf("%s", string); 

    for (i=0; string[i]!='\0'; i++) 
    { 
     if (((string[i]<='a' || string[i]>'z')&&(string[i]<='A' || string[i]>'Z')) ||string[i]!='\0') 
     { 
      seen = 1; 
     } 
     else 
      seen = 0; 
    } 
    if (seen==0) 
    { 
     printf("%s", string); 
    } 
} 
+0

你能告訴你得到的是什麼樣的輸出沒有預料到......即有什麼問題? – zmo

+0

凌晨程序跳過我的聲明並關閉。 – user2985083

回答

0

好了,你的代碼有一對夫婦的重要問題:

所以基本上,你會希望是用fgets()而不是scanf()

但是,爲什麼不只是通過字符得到輸入字符,並建立一個只有你想要的字符的字符串呢?它更簡單和靈活!

基本上是:

#include <ctype.h> 

int main() { 
    char* string[100]; 
    int i=0; 

    printf("Enter your string: "); 

    do { 
     // getting a character 
     char c = getchar(); 
     // if the character is alpha 
     if (isalpha(c) != 0) 
      // we place the character to the current position and then increment the index 
      string[i++] = c; 
     // otherwise if c is a carriage return 
     else if (c == '\r') { 
      c = getchar(); // get rid of \n 
      // we end the string 
      string[i] = '\0' 
     }else if (c == '\n') 
      // we end the string 
      string[i] = '\0'; 
    // while c is not a carriage return or i is not out of boundaries 
    } while (c != '\n' || i < 100); 
    // if we've got to the boundary, replace last character with end of string 
    if (i == 100) 
     string[i] = '\0'; 
    // print out! 
    printf("Here's your stripped string: %s\n", string); 

    return 0; 
} 

我沒有在我的電腦上運行它,因爲它已經很晚了,所以我在錯誤的情況下道歉。

附錄:

凌晨程序跳過我的發言,並關閉

那是因爲你的狀態反轉,並刪除\0條件,因爲它總是與scanf()總是發生將\0附加到字符串以結束它。嘗試更換seen = 1seen = 0或嘗試使用以下條件:

if ((string[i]>='a' && string[i]<='z')||(string[i]>='A' && string[i]<='Z'))) 
     seen = 1; 
    else 
     seen = 0; 

或簡單地說,使用​​的isalpha()功能,就像在我們的兩個例子!

+0

如果您想讀取多個值,'fgets'可能是更好的選擇。對於單個字符串,我認爲它不會比scanf(「%99s」,string)'提供更好的緩衝區溢出保護。 – simonc

+0

@zmo真的非常感謝你的努力,從我看到的也是一個好主意,但我主要試圖理解並試圖做複雜的事情 – user2985083

+1

很好理解什麼是錯的,當它不起作用。但是要記住,你寫的代碼量越少,代碼就越簡單,就會有越少的錯誤......越容易重讀代碼! – zmo

0

沒有部分(刪除多餘的字符)來更改代碼中的字符串。

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

char *filter(char *string, int (*test)(int)) { 
    char *from, *to; 
    for(to = from = string;*from;++from){ 
     if(test(*from)) 
      *to++ = *from; 
    } 
    *to = '\0'; 
    return string; 
} 

int main(){ 
    char string[100]; 
    printf("Enter String: "); 
    scanf("%99s", string); 
    printf("%s\n", filter(string, isalpha)); 

    return 0; 
}