2015-04-02 60 views
0

我正在閱讀C語言書籍,我堅持下面的代碼...正如我已經顯示的C代碼我使用for()循環來獲取字符in.and相同我用循環在屏幕上打印字符......如果用戶按下enter循環將退出,另一個用於在屏幕上打印的()循環將使用i變量的值。但是屏幕上的結果是相反的。我可以得到你的意見,我怎麼能解決它?一次獲得一個字符與loop_in_C

#include <string.h> 
#include <stdio.h> 
int main() 
{ 
int i; 
char msg[25]; 
printf_s("Type up to 25 characters then press Enter..\n"); 
for (i = 0; i < 25; i++) 
{ 
    msg[i] = getchar();// Gets a character at a time 
    if (msg[i] == '\n'){ 
     i--; 
     break;// quits if users presses the Enter 
    } 
}putchar('\n'); 
for (; i >= 0 ; i--) 
{ 
    putchar(msg[i]);// Prints a character at a time 

}putchar('\n');/*There is something wrong because it revers the input */ 

getchar(); 
return 0; 
+0

林不熟悉C,但我現在可以告訴你,你使用的for循環遞減不遞增,這可能解釋了爲什麼它是以相反的順序打印字符...你期望做什麼就印刷結果而言,你的第二個for循環? – ryekayo 2015-04-02 21:15:40

+0

如果我將使用遞增運算符,它將執行到無限循環....並且它將導致緩衝區溢出 – JFC 2015-04-02 21:19:38

+0

正確但for循環完全按照您的要求執行,按相反順序打印字符。你期待它做什麼? – ryekayo 2015-04-02 21:20:34

回答

1

輸入後,所述可變i保持字符的msg的具體數量。這就是爲什麼有一個i--聲明,所以當你輸入ab<enter>你會有我== 2不是== 3。

第二個循環倒數到0,這不是你想要的。您需要從0到最多i。現在你不能指望我使用我。你需要兩個變量:一個保持最大值,一個做實際的計數。

我會留給你決定如何做到這一點,因爲這是學習的一部分。

+0

感謝您的回覆...由於用戶輸入ab ,變量i將= 2,我創建一個名稱爲a的變量。但它似乎不是解決方案,或者我明白你錯了 int a;幾乎沒有: \t用於:(a = 0;一 JFC 2015-04-02 21:56:16

+0

@FatlonderCakolli { \t \t的putchar(MSG [I])//一次 \t打印字符}:它必須是'a 。 – MSalters 2015-04-03 10:43:51

+0

抱歉晚答覆我解決這個問題謝謝你的忠告 的#include 的#include INT main()中 { \t INT I; \t char msg [25]; (最多輸入25個字符,然後按Enter .. \ n「); \t爲(I = 0; I <25;我++) \t { \t \t MSG [I] =的getchar(); //在一個時間獲取一個字符 \t \t如果(MSG [I] ==「\ n'){ \t \t \t i--; \t \t \t斷裂; //如果退出用戶按下回車 \t \t} \t}的putchar( '\ n'); \t int a; (a = 0; a <= i; a ++) \t putchar(msg [a]);} putchar('\ n'); \t return 0; } – JFC 2015-04-14 22:23:56

0

使用qsort進行排序的方法如下。

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

int cmp(const void *, const void *); 

int main(void){ 
    int i, n; 
    char msg[25]; 

    printf_s("Type up to 25 characters then press Enter..\n"); 
    for (i = 0; i < 25; i++){ 
     int ch = getchar(); 
     if(ch == '\n' || ch == EOF) 
      break;//if (msg[i] == '\n'){i--; <<- this cannot be 25 character input. 
     else 
      msg[i] = ch; 
    } 
    putchar('\n'); 

    n = i; 
    qsort(msg, n, sizeof(char), cmp);//sizeof(char) : 1 

    for (i = 0; i < n ; ++i){ 
     putchar(msg[i]); 
    } 
    putchar('\n'); 

    getchar(); 
    return 0; 
} 

int cmp(const void *a, const void *b){ 
    unsigned char x = *(const char *)a; 
    unsigned char y = *(const char *)b; 
    return (x < y) ? -1 : (x > y);//Ascending order 
}