2016-07-10 32 views
0
#include <stdio.h> 
#include <stdlib.h> 

struct test 
{ 
    int id; 
    char name[20]; 
}; 

int main() 
{ 

struct test t1; 

    t1.id=1; 
    fflush(stdin); 
    fgets(t1.name,20,stdin); 

    print((&t1.name));   
    print1(t1.id,&(t1.name));  

} 
void print(struct test *name) 
{ 
    puts(name); 
} 

void print1(struct test id,struct test *name) 
{ 

    printf("\n%d\n",id); 


    puts(name); 
} 

當運行該程序,它要求輸入爲什麼放在下面的代碼不工作?

測試[輸入]

輸出出來

測試(然後程序終止)

爲什麼第一放工作,爲什麼把第二個功能沒有?是的,可以選擇發送完整的結構,但我想知道這裏有什麼問題。

+3

一開始'fflush(標準輸入);'不正確。去掉它。 –

+1

也許編譯與所有的警告將幫助 –

+0

我已經開始使用刷新時,需要採取多個字符串變量同時例如string1,string2與fgets。如果我不使用fflash()字符串的輸入更奇怪 – ekaf

回答

2

你的程序不有幾個原因的工作:

  • 您撥打的缺乏前瞻性聲明功能 - 你應該看到警告,當你的程序編譯。不要忽視它們
  • 您的功能正在採用錯誤類型的參數 - 您應該收到與各個字段對應的類型,例如, void print1(int id, char *name)還是應該通過整體結構,通過值或指針,即void print1(struct test t)

一旦你解決這兩個問題,並確保你的程序編譯無警告,並啓用所有的編譯器警告,這個問題應解決。

+0

也許增加打開所有的警告。 –

+0

感謝工作。我2更多的問題。首先我沒有得到我缺乏前進宣言第二爲什麼要做第一個打印(結構測試*名稱){放置(名稱)}工作? – ekaf

+1

@ekaf第一個'puts'是偶然發生的。不幸的是,這在C語言中很常見 - 因爲語言如此低層次,通常一個不正確的程序會產生類似於正確輸出的東西。這被稱爲未定義的行爲。 – dasblinkenlight

0

你需要這個

void print(char *name) 
{ 
    puts(name); 
} 

和呼叫必須

print(t1.name);   

puts需要char *(或實際const char *)。

t1.name具有數據類型char *

同樣

void print1(struct test id, char *name) 
{ 

    printf("\n%d\n",id); 


    puts(name); 
} 

print1(t1.id,& t1.name);  

陣列的名稱退化到一個數組的第一元素的地址的呼叫。所以當t1.name被傳遞給函數時,它就成爲char數組的開始地址。

1
void print(struct test *name) 

應改爲

void print(char name[]) // because you wish to print a null terminated array of characters. 


print((&t1.name)); 

應改爲

print(t1.name); //name is the array you wish to print 
+0

'print((t1.name);''也許'print(t1.name);' –

+0

@EdHeal:Thankyou Ed,一如既往:) – sjsam

+1

如果我的要求是將它作爲參考發送這樣我可以在打印之前對該功能進行更改? – ekaf

相關問題