2016-04-21 113 views
-2
struct sign_in 
{ 
    char password[MAX_NAME_LEN+1];//The password for each player 
    char name[MAX_NAME_LEN+1];//Name of the people who can sign in 
} 



//prototype 
int compare_names(char*, char*, struct sign_in*); 


int compare_names(char*pName,char*pPassCode,struct sign_in *var) 
{ 
    int iComparison = 1; 
    int flag = 1; 
    int iComparison2 = 1; 
    int i = 0; 

    for (i=0;i<6;i++) 
    { 
     printf("%s \t %s ", var[0].name,pName); 
     if(iComparison != 0) 
     { 
      iComparison = strcmp(pName,var[i].name); 
      i++; 
     } 
     if(iComparison2 != 0) 
     { 
      iComparison2 = strcmp(pPassCode,var[i].password); 
      i++; 
     } 

     printf("%d", iComparison); 
     printf("%d", iComparison2); 
    } 
} 

我已經更新了我的代碼,並試圖考慮到你們推薦的許多方面,並且好消息是它現在運行。壞消息是,它仍然試圖打印一些我不明白的隨機術語,通常只是一些符號的集合。這個函數比較的結構有六個成員,所以這是第一個for循環的參數的原因。通過一個比較結構

+0

你可以發佈struct sign_in的定義嗎? 'iComparisson,flag = 1;','while(iComparisson == 1)'後面的' –

+0

'是未定義的行爲,使用具有自動存儲持續時間的對象的值而不確定。 – EOF

+0

添加了定義 – JMBTaylor

回答

2

你提出的代碼是一個馬虎的馬屁精。編程時,這不是真的。

  • 你忘了struct sign_in定義和compare_names()函數定義
  • 你沒有初始化iComparisson任何值右大括號。 flag已初始化,但iComparisson不是。另外,拼寫錯誤!
  • 請勿使用printf(),並將用戶輸入作爲格式字符串,其中可能有%。至少做printf("%s", pname)。你也可能想要一個\n
  • strcmp()可能返回-1var[i].name前平均pName排序(並不同於其當然的),所以while(iComparisson == 1)不會做你希望
  • 你需要知道var數組的長度,並在運行之前停止循環off end
  • strcmp()需要字符串,它們是指針。當你打電話給strcmp(*pName, ...)時,你將pName「指向char的指針」解除引用爲「char」。這就像獲取pName字符串中的第一個字符,然後將該字符值放在需要指向字符值的位置。不好。 var[i].name的情況稍微複雜一些,因爲name是一個數組,但是除掉星號,它不是必需的。
  • 第二while()循環將永遠循環下去,如果iPassCode不匹配,你可能想if()
  • 在你的問題說明你忽略*var[i].password後閉幕反引號後「的unaray無效的類型參數」右雙引號,而且你明顯也會損壞編譯器錯誤信息。這使得你很難理解你寫的和錯誤。
  • iPassCode == var[i].password實際上看起來不錯。這似乎很可能,這不是你有問題的代碼,因爲你的示例中的所有其他荒謬問題...
+0

我想我做了大部分您推薦的更改並更新了我的代碼。 – JMBTaylor

+0

在您的最新版本中,每個if()塊中額外的'i ++'都沒有意義,您應該刪除它們。但是,如果有人使用其他用戶的用戶名和密碼,則您認爲它會成功登錄。 – Pierce