2012-04-09 58 views
2

我慢慢學習C.我閱讀此頁有關輸入和處理字符串輸出這裏:http://www.cprogramming.com/tutorial/c/lesson9.html「與fgets」運行「的printf」

在過去的代碼示例,fgets用於獲取和分配輸入到char數組的變量name。我嘗試在自己的程序中實現類似的東西。

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

/* This is my very first C program! */ 

bool test=true; 

/* Function Prototypes */ 

int mult(int x, int y); 

/* Structures */ 

struct Person { 
    int age; 
    char name[256]; 
}; 

/* Complicated Array ;P */ 

struct Person *FirstPeriod[22]; 
char FakeString[100]; 

void PracticeStrings() 
{ 
    int i; 
    fgets(FirstPeriod[0]->name, 256, stdin); 
    for (i=0;i<256;i++) 
    { 
      if (FirstPeriod[0]->name[i]=='\n') 
       FirstPeriod[0]->name[i]='\0'; 
    } 
    printf("\n\nHello Student 0: %s",FirstPeriod[0]->name); 
} 

int main() 
{ 
    struct Person DadeLamkins; 
    DadeLamkins.age=16; 
    int numb; 
    int x; 
    int *numb_address=&numb; 
    numb_address=malloc(sizeof(*numb_address)); 

    FirstPeriod[0]=&DadeLamkins; 

    if (true) 
     printf("-__- \n\n"); 

    printf("Please enter a number: "); 
    scanf("%d", &numb); 
    switch (numb) { 
     case 0: 
      printf("Dude, 0 is lame...\n"); 
      break; 
     case 7: 
      printf("Dude, 7 is my favorite number!\n"); 
      break; 
     default: 
      printf("You entered %d\n", numb); 
      break; 
    } 
    for (x=0;x<numb+1;x++) { 
     printf("\n::# %d",mult(x,2)); 
    } 
    printf("\n\n%d",numb_address); 
    free(numb_address); 
    numb_address=0; 
    PracticeStrings(); 
    getchar(); 
    return 0; 
} 

int mult (int x, int y) 
{ 
    return x*y; 
} 

第26行的PracticeStrings函數是當前的問題。當我編譯時,它在接受輸入之前顯示Hello Student 0:(來自fgets)。我使用Code :: Blocks進行編譯。

任何幫助,將不勝感激!

編輯...

哈哈哈,是的,我明白,我的計劃是低效的,非常愚蠢的。正如你所看到的,它並沒有真正的成就。這主要是推動我目前學習的東西,並試圖在不重寫代碼示例的情況下應用這些東西(如果我逐字複製,我會學到什麼?)。無論如何,感謝您的幫助!我想這是有道理的!我的教程沒有提到這一點太糟糕了,我相信這只是需要一點點的理解。我相信這位教程編寫者並不期望任何人按照我所做的方式來組合功能。

謝謝噸傢伙!希望我能習慣這一點。我已經做了很多的腳本和大量的.NET語言,希望我可以添加C到這個列表:)

+0

'INT * numb_address = &numb; numb_address = malloc的(的sizeof(* numb_address));' - >'INT * numb_address = malloc的(的sizeof(麻木));' – Ryan 2012-04-09 23:38:50

+0

@minitech,是的,良好的通話。我主要是爲了學習目的而慢慢地在同一個項目上建設。我一直在使用其他語言進行編程,但我想確保我能夠輕鬆掌握這些基礎知識。 – FreeSnow 2012-04-09 23:42:33

+0

有趣的學習。當用戶學會使用fgets等時,你對「\ n」所遇到的問題是極其常見的。如果它完成了對你的更多瞭解,我會說程序有很多功能; P - 另外;因爲您使用的是CodeBlocks(我推薦使用純控制檯開始)啓用警告。即對於GCC:Settings-> Compiler and debugger - > [Compiler Flags] [Categories-> Warnings]:Check -Wall,-Wextra,-pedantic。 – Morpfh 2012-04-10 01:53:25

回答

3

這是因爲當你閱讀次數:

scanf("%d", &numb); 

stdin仍然有\n左在緩衝區中。所以,當你調用PracticeStrings(),隨後:

fgets(FirstPeriod[0]->name, 256, stdin); 

你讀\n

FirstPeriod[0]->name[i] == '\0'; 

而且結束了,因爲你正在學習,學會驗證:)

即:

if ((foo = malloc(blah)) == NULL) { 
    ... err ... 

而且更爲關鍵:

if (scanf(..) != number_of_items_i_want) { 
    ... did not get a number, or what ever I wanted ... 

0

我覺得你的問題是由於您的控制檯的行爲,你的scanf()電話。

控制檯的默認設置可能是行緩衝。這意味着,在您輸入密鑰之前,您在終端上輸入的內容都不會發送到stdin。

但是,您撥打scanf()(位於main())只能獲取您輸入的整數 - 而不是尾隨回車。 一個方法是讓scanf()也消耗尾隨的回車:

 
scanf("%d%*c", &numb); 
它從標準輸入讀入整數 &numb,並讀取(並丟棄)一個額外的字符。

這是所有使用scanf()的大問題之一,這就是如何在遇到你不期待的字符串時應付它。 更安全的方法是使用fgets()sscanf()的組合。前者會讓你從文件中讀取一個字符串(如你所做的那樣),而後者將在其上運行一個格式化字符串。 例如。


    char temp[20]; 
    fgets(temp, 20, stdin); 
    sscanf(temp, "%d", &numb);