2014-12-06 66 views
0

你好,我是在編程很新,想了解一些從你:) 我做以.c程序,我在stucked部分。 我想獲得3個或更多的輸入最多5個字符的大小。 (例如:HELLO,HI,GOOD,BYE) ,我想將它們堆疊在其保持相同的字母從這些4個字符串僅一次一個新的字符串 (實施例:H,E,L,L,O,I,G ,D,B,Y)組合兩個字符串連接爲一個字符串,它消除了在C相同的字母

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

int main(void) { 
char first[5], second[5], third[5], fourth[5]; 
printf("Enter 1st word: \n"); scanf(" %5s", &first); 
printf("Enter 2nd word: \n"); scanf(" %5s", &second); 
printf("Enter 3rd word: \n"); scanf(" %5s", &third); 
printf("Enter 4th word: \n"); scanf(" %5s", &fourth); 

char stack[21]; // i want a new string like this and then combine first 4 strings 
       // in this string... 

return 0; 
} 

我希望你能讓我知道我可以做到這一點。 (我也是在該網站新我搜索了這一點,但我找不到很抱歉,如果它的存在。)

+0

你想在結果字符串中的字母是以任何特定的順序? – 5gon12eder 2014-12-06 18:08:25

+0

@ 5gon12eder - 不,我只是想把這些字符串結合在一個字符串中去掉多餘的字母。 – Gorki 2014-12-06 18:18:16

+1

我建議使堆棧數組[21]考慮到所有唯一字母(和null)的可能性。 – doppelheathen 2014-12-06 18:23:56

回答

1

首先在你的代碼的一些意見:

  • 作爲其他的評論已經提到一個人,你需要一個緩衝區的大小ň + 1舉辦的ñ字符串。這是因爲在C中,字符串的長度不存儲在任何地方。相反,將一個特殊的NUL字節附加到標記其結尾的字符串。因此,您的first,...,fourth陣列應該是長度至少爲6
  • 如果最壞的情況發生,用戶進入每四個價值500個字符不相交的話嗎?然後你的組合字符串將計數20個字符。所以你的stack數組應該能夠容納21個字符(終止NUL字節也是1)。 (user3121023的評論提及)
  • 要使用scanf讀取字符串,請傳遞類型爲char *的參數,而不是char (*)[6]first已經衰減到char *,所以不要另外接收它的地址(如&first)。打開編譯器的警告(至少使用-Wall)以獲知此類錯誤。 (也由Dere0405提到,而我打字這個答案。)
  • 您使用的scanf是不安全的。如果用戶輸入的字符串長度超過5個字符,則會超出數組的末尾。您可以修改格式說明符以讀取%5s以告訴scanf在第5個字符後停止讀取。但是,這會在行尾留下多餘的字符。更好的選擇是使用fgetsgetline來讀取整行輸入。或者,只需將字符串作爲命令行參數傳遞(我的首選解決方案)。

我們實際的問題:

我不會給你一個完整的解決方案,但只有一些暗示,因爲這看起來非常像功課。 (不幸的是,別人已經給你完整的代碼,所以你可能會忽略我的答案。)

你必須遍歷所有五個字符串,並檢查每個字符,如果它已被添加到stack。如果是這樣,請繼續,否則,將它附加到stack。要循環一個字符串,我們可以使用下面的習慣用法。

int i; 
for (i = 0; first[i]; ++i) 
    printf("The character at position %d is '%c'\n", i, first[i]); 

或者,如果我們不需要引用當前索引,則下面的習語更加緊湊。

char * pos; 
for (pos = first; *pos; ++pos) 
    printf("The current character is '%c'\n", *pos); 

注意我們是如何使用的事實,first - 作爲一個C字符串 - 終止與計算爲false NUL字節。否則,我們不知道在哪裏停止迭代。

現在我們知道如何遍歷字符串的字符,我們如何檢查字符是否已經添加?記住兩種解決方案:

  1. 循環遍歷stack並將每個元素與當前正在討論的字符進行比較。雖然對於你的短字符串,這可能是選擇的方法,但對於更長的字符串來說,它會變得效率低下。

  2. 爲每個字符創建一個計數器,並在每次添加到stack時遞增。你可以使用這個事實,即char只是數字。所以你可以創建一個256個元素的數組(有256個不同的char s),所有這些元素最初都設置爲0,然後增加當前添加的字符的位置。例如:

    int counters[256]; 
    memset(counters, 0, sizeof(counters)); /* fill with 0s */ 
    
    後面的代碼

    然後:

    if (counters[(unsigned char) (*pos)]++) 
        { 
        /* Character was already added. Do nothing. */ 
        } 
    else 
        { 
        /* Character was not added yet. Add it to stack. */ 
        } 
    

    if (counters[(unsigned char) (*pos)]++)是有點棘手。首先,*pos dreferences指針pos產生當前字符,然後將其解釋爲unsigned char,因爲數組不能有負索引。然後,該位置在counters陣列中查找,並在if聲明中進行評估。最後,通過增量後運算符增加該值(但僅在比較之後)。

不要忘記終止stack與最後的NUL字節。

+0

非常感謝你,那就是我一直在尋找的東西:)我要親自嘗試一下,看看你的類型:) – Gorki 2014-12-06 19:26:43

0

請更新您的代碼如下:

printf("Enter 1st word: \n"); scanf(" %s", &first); 

printf("Enter 1st word: \n"); scanf(" %s", first); 

請更新至其他行。

+0

這是爲什麼?不應該在scanf中的變量有&? – wadie 2014-12-06 18:26:47

+0

嗯,這是我只能肯定的事^^,我想我沒有錯那裏,我也沒有得到任何警告,而執行 – Gorki 2014-12-06 18:29:49

+0

@Gorki你*應*得到*編譯器警告*。執行時,它只是調用未定義的行爲,所以任何事情都可能發生或可能不會發生。看到我的答案多一點解釋。 – 5gon12eder 2014-12-06 19:22:17

0

嘗試:

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

int main(void) { 
    char strings[4][6]; 
    printf("Enter 1st word: \n"); scanf(" %s", strings[0]); 
    printf("Enter 2nd word: \n"); scanf(" %s", strings[1]); 
    printf("Enter 3rd word: \n"); scanf(" %s", strings[2]); 
    printf("Enter 4th word: \n"); scanf(" %s", strings[3]); 

    char stack[21]; // This needs to be pretty much bigger than all combined just in case 

    // Initialize the stack string to 0 length 
    stack[0] = '\0' 

    // Move through each word 
    for(unsigned char word = 0; word < 4; word++){ 

     // Move through each letter of each word 
     for(unsigned char letter = 0; letter < strlen(strings[word]); letter++){ 
      // Test to see if the current letter is within the current stack string 
      unsigned char schar; 
      for(schar = 0; schar < strlen(stack); schar++){ 
       if(stack[schar] == strings[word][letter]) break; 
      } 

      if(schar >= strlen(stack)){ 
       unsigned char sstacklen = strlen(stack); 
       stack[sstacklen] = strings[word][letter]; 
       stack[sstacklen+1] = '\0'; 
      } 

     } 
    } 

    return 0; 
} 

這應該爲你想要什麼樣的工作,這是一個快速的寫,所以可能會有小的誤差!

相關問題