2011-10-22 178 views
1

我有程序要求輸入一個字符串(mystring)和一個字符(ch)。然後它從字符串(mystring)中刪除所有輸入的字符(ch)。例如「abcabc」和char'a',那麼結果應該是「bcbc」。 - 當我使用scanf時,如果字符串沒有空格,程序會很好地工作。如果我輸入「abc abc abc」,它只讀取和處理前3個字母(直到空格)。 然後我被建議使用gets(mystr);因爲它可以讀取所有的混合物。但是,當我使用得到的結果是相同的輸入字符串,並沒有任何反應。C從字符串中刪除字符

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define N 100 

int main(int argc, char *argv[]) 
{ 
    char mystr[N] ,result[N]; 
    char ch; 
    int i,k; 
    k=0; 

    printf("enter string \n"); 
    //gets(mystr);/////////////////////////// 
    //scanf("%s",&mystr);/////////////////// 
    printf("enter char \n"); 
    scanf("%c",&ch); 
    scanf("%c",&ch); 

    for (i = 0; i <= strlen(mystr); i++) 
    { 
    if (mystr[i] != ch) 
    { 
     result[k]=mystr[i]; 
     k++; 
    } 
    } 
    puts(result); 
    system("pause"); 
    return 0; 
} 
+2

**不要**使用'gets()'。這本質上是不安全的。 –

回答

6
scanf("%c",&ch); 
scanf("%c",&ch); 

這第二scanf是你的問題。它會提取您要刪除的字母后輸入的換行符(並覆蓋之前的ch的值)。

擺脫它。

請注意,由於該男子頁說:

不要使用gets()函數。因爲它是不可能告訴不知道提前許多 字符如何獲取數據()將讀取,而且由於得到()將繼續存儲字符過去的 緩衝區末尾,這是非常危險的使用。它已被用來破壞計算機安全。改爲使用 fgets()。

+2

這是'get'的好建議 - 請參閱http://stackoverflow.com/questions/4023895/how-to-read-string-entered-by-user-in-c/4023921#4023921以獲得體面的用戶輸入功能。 – paxdiablo

1

嗯 - 不知道是什麼問題 - 使用getstr,而不是scanf函數的字符串,並在Visual Studio中對我的作品

int main(int argc, char *argv[]) 
{ 
    char mystr[N] ,result[N]; 
    char ch; 
    int i,k; 
    k=0; 

    printf("enter string \n"); 
    gets(mystr);/////////////////////////// 
    //scanf("%s",&mystr);/////////////////// 
    printf("enter char \n"); 
    scanf("%c",&ch); 
    // scanf("%c",&ch); 

    for (i = 0; i <= strlen(mystr); i++) 
    { 
    if (mystr[i] != ch) 
    { 
     result[k]=mystr[i]; 
     k++; 
    } 
    } 
    puts(result); 
    system("pause"); 
    return 0; 
} 
1

使用這一個:

char temp[2]; 
scanf("%1s",temp); 
ch = temp[0]; 

char小號使用時使用gets

scanf有一些問題(它獲取的 「老」 的新行)。這裏我們「欺騙」一下,我們使用scanf來得到一個字符串,最多可以有一個字符。一個1字符的字符串顯然需要第二個字符作爲終止符,所以需要2個字符的數組。

注意,使用scanf的字符進行搜索,你將無法插入空格字符。

注意gets是一個「邪惡」的功能。你可以很容易地使用緩衝區溢出(它不檢查緩衝區是否足夠大)。 「正確」的方式做到這一點通常是:fgets(mystr, N, stdin);(的gets「文件」變型具有可以讀取的最大字符數,並會追加一個\0末)。需要注意的是,如果你在一個fgets插入150個字符,99會去您的字符串(因爲你給了最大尺寸的100),1個\0將追加和其他字符將保留在緩衝區「準備好了」下一個scanf/gets/fgets ...(測試它,減少緩衝區到一個較小的值,如5個字符,並做一些測試)

1

您可以使用fgets()建議由xanatos小黑客,所以你可以可靠地處理返回字符。只需在使用fgets獲得的字符串中將'\ n'更改爲'\ 0'即可。

而在您的程序中,您忘記了用'\ 0'來終止新字符串。 所以這裏是你正在尋找的代碼。

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

#define N 100 

int main(int argc,char **argv){ 

char string[N],str1[N]; 
char ch; 
int i,k = 0; 

fgets(string,N,stdin); 
string[strlen(string)-1] = '\0'; 
scanf("%c",&ch); 

printf("\n%s , %c",string,ch); 
for (i=0;i<=strlen(string);i++) 
    if(string[i] != ch) 
     str1[k++] = string[i]; 

str1[k] = '\0'; 
printf("\n%s , %s\n",string,str1); 
return 0; 
}