2016-04-21 112 views
0
int iPassCode, iNumber = 0; 

void main() 
{ 
    iNumber = get_name(); 
    iPassCode = get_code(); 
    name_strucutre(); 
} 

int get_name() 
{ 
    printf("Please enter your name: "); 
    cName[MAX_NAME_LEN] = getchar(); 
    if(strcmp(cName,"leia"||"Leia")) 
    { 
     iNumber = 1; 
    } 
    if(strcmp(cName,"darth"||"Darth")) 
    { 
     iNumber = 2; 
    } 
    if(strcmp(cName,"r2d2"||"R2D2")) 
    { 
     iNumber = 3; 
    } 
    if(strcmp(cName,"solo"||"Solo")) 
    { 
     iNumber = 4; 
    } 
    if(strcmp(cName,"jabba"||"Jabba")) 
    { 
     iNumber = 5; 
    } 
    if(strcmp(cName,"yoda"||"Yoda")) 
    { 
     iNumber = 6; 
    } 
    else 
    { 
     iNumber = 0; 
    } 
    return(iNumber); 
} 

int get_code() 
{ 
    printf("Please enter your pass code: "); 
    scanf("%d", iPassCode); 
    return (iPassCode); 
} 

我在這裏得到了幾個函數。其中之一,我認爲它的get name()功能正在導致程序崩潰。現在我所要做的就是收集用戶的姓名和密碼,並將信息傳遞迴main()。儘管只是一個單數,我不想把整個名字都傳回去。c讀取字符串導致崩潰

+0

'MAX_NAME_LEN' ??? ??? –

+1

'「leia」||「Leia」並沒有做你認爲正在做的事情。您需要兩個單獨的'strcmp'調用或一個'stricmp'變體。 (你錯過了某個西斯主的小寫版本)。 – Bathsheba

+0

'#define MAX_NAME_LEN 42'忘了提及我在開始時有這個 – JMBTaylor

回答

3

有多種問題,讓我們來分析一下他們通過一個

  1. 首先之一,

    cName[MAX_NAME_LEN] = getchar(); 
    

    是無效的,因爲

    • 按照最新標準,默認爲int不再是一個標準。您需要定義數據類型

    • getchar()的單個調用讀取一個char。至少需要一個循環。

    您需要更改爲類似

    char cName[MAX_NAME_LEN] = {0}; 
    

    ,然後遍歷getchar()讀取輸入。

    否則,爲了更好,請使用fgets()來讀取和存儲輸入。

  2. 這就是說,你不能在一個單一的電話比較多串像

    if(strcmp(cName,"leia"||"Leia")) 
    

    這基本上是

    if(strcmp(cName,1)) 
    

    這又是非法的。您可以使用strcasecmp()忽略該情況。否則,爲了嚴格符合標準,您必須使用單獨的strcmp()調用來將字符串與每個驗證器進行比較。

    並且是,strcmp()返回0成功(匹配)

  3. 你正在寫

    scanf("%d", iPassCode); 
    

    這應該是

    scanf("%d", &iPassCode); //missed the address-of 
    

所有這些之後,從一種編碼風格一點,讓我補充一點,return是一個關鍵字,不要讓它看起來像一個函數調用。

+0

那麼這樣做? 'cName [MAX_NAME_LEN] = fgets();' – JMBTaylor

+0

@JMBTaylor不,那根本不是語法。請閱讀鏈接手冊頁。 –

+0

啊,明白了。該鏈接是爲一個Linux fgets和一個難以理解的初學者,但我需要改變它是'gets(cName);' – JMBTaylor

0

在這些錯誤請看:

  • 您正在使用

    的scanf( 「%d」,iPassCode);

,以便閱讀,但你已經宣佈

int iPassCode; 

scanf閱讀需求的指針。

scanf("%d", &iPassCode); 
  • 替換它的另一個錯誤是你比較字符串的方式。所有的比較如下格式替換:

    if ((strcmp(cName,"something") == 0) || (strcmp(cName,"something") == 0)) 
    
  • 而且,你不能有cName[MAX_NAME_LEN] = getchar();作爲一個有效的聲明。

  • 最後我想你已經在某個地方定義了MAX_NAME_LEN,否則你應該這樣做。
+0

這是一個看起來很糟糕的錯誤,但我認爲程序沒有那麼遠,因爲在通知我之前它仍然崩潰。 – JMBTaylor

+0

@JMBTaylor我更新了我的帖子,看到了更多的錯誤,請看看:) – Marievi

3

表達式strcmp(cName,"leia"||"Leia")相當於strcmp(cName, 1)

子表達式"leia"||"Leia"true其在C中相當於1

如果你想檢查一個字符串是否相等,你需要兩個strcmp調用:strcmp(cName,"leia") == 0 || strcmp(cName,"Leia") == 0

+0

或者類似'stricmp',儘管我永遠不會記得這是否是標準C。 – Bathsheba

+0

@Bathsheba Nope,這是一個Windows CRT特定功能。 C標準沒有大小寫不敏感的比較。 –

+0

@JoachimPileborg'strcasecmp()'怎麼樣? [POSIX] –