2017-09-01 181 views
0

下面是一個問題,我們需要用另一個新字符串替換字符串中所有字符的出現。 下面給出的是這樣一個問題:無法用另一個字符串替換字符串中的字符

編寫一個程序,替換給定字符的發生(比如C) 在主字符串(說PS)與另一個字符串(比如S)。

輸入: 第一行包含在主串(PS) 下一行包含一個字符(C) 下一行包含一個字符串(或多個)

輸出: 打印串PS與每一個發生c被s代替。

NOTE: - PS或s中沒有空格。 - PS的最大長度爲100 - S的最大長度爲10

下面是我的代碼:

#include<stdio.h> 
int main() 
{ 
    char ps[100],*ptr,c,s[10]; 

    printf("Enter any string:"); 
    gets(ps); 

    printf("Enter the character you want to replace:"); 
    scanf("%c",&c); 

    printf("Enter the new string:"); 
    fflush(stdin); 
    scanf("%s",&s); 

    ptr=ps; 

    while(*ptr!='\0') 
    { 
     if(*ptr==c) 
     *ptr=s; 
     ptr++; 
    } 

    printf("Final string is:"); 
    puts(ps); 
    return 0; 
} 

我不能用字符串替換字符。它只是給我一個垃圾輸出而不是我想要替換的角色。

但是,當我將它聲明爲字符時,輸出與預期的一樣。它用另一個角色代替角色。

你能幫我解決嗎?

+2

'fflush(stdin)'和'gets()'...都是壞的。 –

+2

你看到的'垃圾'可能是一個內存地址... –

+2

我建議將結果字符串寫入一個新的'char'數組。 'c'中的數組不會自動調整大小。即使你正確地用字符串's'替換字符'c',如果's'多於一個字符長度,它將覆蓋'ps'中的字符,這不是你想要的。你當然可以在陣列中移動角色來爲新陣列騰出空間,但這會比編寫一個新陣列更困難的編碼方式。 – yano

回答

1

*ptr=s;

if(*ptr==c) 
    *ptr=s; 

真的分配字符數組s到所述存儲器位置的基地址由ptr指向。這不會用字符串替換字符,但會導致錯誤。

我同意yano。最好創建一個新的字符數組來存儲結果字符串,因爲原始數組可能沒有足夠的空間來容納新字符串。

如果新的字符串是result,你可以不喜歡

for(i=j=0; ps[i]!='\0'; ++i) 
{ 
    result[j++]=ps[i]; 
    if(ps[i]==c) 
    { 
     for(--j, k=0; s[k]!='\0'; ++k) 
     { 
      result[j++]=s[k]; 
     } 
    } 
} 
result[j]=0; 

scanf("%s",&s);scanf("%s", s);作爲數組decays into a pointer它的第一個元素的名稱。

最好避免gets()fflush(stdin)作爲Sourav Ghosh提到。

fgets()gets()because you can guarantee you never overflow the input string buffer更安全。

至於fflush(stdin)是錯的,看看here

3

在C中,一個字符串是一個字符序列,由第一個地址表示。因此*ptr = s應該已經得到了關於編譯器中不匹配類型的警告。如果你想插入一個字符串到另一個,你需要移動其他字符,以騰出空間。

,但似乎你的問題的描述並不要求你做一個新的字符串,只是打印彷彿你了。因此,您可以遍歷原始字符串,並且對於每個字符,如果要替換它,則打印替換字符串,否則打印原始字符。

+0

可以改進:「在C中,一個字符串是一系列字符,由第一個地址表示。」在C中,_string_是一個字符序列,包括_null字符_。 _string_更像是一個數組而不是一個地址。 – chux

+0

謝謝,但我該如何更改我的代碼?我應該確定新的字符串長度並在要替換的字符後創建那麼多空格嗎?如果是的話,我該怎麼做? – akash11

相關問題