作者 主題: 幫我看一下我寫的程式  (閱讀 9263 次)

0 會員 與 1 訪客 正在閱讀本文。

luxgenacertw

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
幫我看一下我寫的程式
« 於: 2011-08-11 23:35 »
我寫了一個帳密設定程式,設定完後會要求登入系統,如果帳密輸入錯​誤就會顯示帳密錯誤的程式,大概是這樣,但我寫出來之後不管帳密輸入錯還是輸入對,最​後都是顯示帳密對的,希望高手幫我檢查一下
#include <stdio.h>
int username,password,a,b;
int main(void)
{
printf("請設定您的帳號:");
scanf("%s,&username");
printf("請設定您的密碼:");
scanf("%s,&password");
printf("\n\n");
printf("請輸入你的帳號:");
scanf("%s,&a");
printf("請輸入你的密碼:");
scanf("%s,&b");
if((username==a)&&(password==b))
printf("帳號密碼正確,登入本系統");
else
printf("帳號密碼錯誤");
return 0;
system("pause");
}
這是原始碼,麻煩高手囉!

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
Re: 幫我看一下我寫的程式
« 回覆 #1 於: 2011-08-11 23:48 »
我寫了一個帳密設定程式,設定完後會要求登入系統,如果帳密輸入錯​誤就會顯示帳密錯誤的程式,大概是這樣,但我寫出來之後不管帳密輸入錯還是輸入對,最​後都是顯示帳密對的,希望高手幫我檢查一下
#include <stdio.h>
int username,password,a,b;
int main(void)
{
printf("請設定您的帳號:");
scanf("%s,&username");
printf("請設定您的密碼:");
scanf("%s,&password");
printf("\n\n");
printf("請輸入你的帳號:");
scanf("%s,&a");
printf("請輸入你的密碼:");
scanf("%s,&b");
if((username==a)&&(password==b))
printf("帳號密碼正確,登入本系統");
else
printf("帳號密碼錯誤");
return 0;
system("pause");
}
這是原始碼,麻煩高手囉!

在判斷對錯之前先將所有資料都印出來, 看看這些資料是否都如你預期的那樣

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5411
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: 幫我看一下我寫的程式
« 回覆 #2 於: 2011-08-12 00:55 »
宣告是 int, 輸入時當成字串 => 沒有 segment fault 算運氣好吧.

zzz0072

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
Re: 幫我看一下我寫的程式
« 回覆 #3 於: 2011-09-25 23:24 »
1. 要使用char 的連續空間(陣列或動態分配)存放字串
2. 字串比較可以用strcmp,strncmp,或是其他方式

timloo

  • 懷疑的國中生
  • **
  • 文章數: 30
    • 檢視個人資料
    • http://pcteacher.com.tw/~tim
Re: 幫我看一下我寫的程式
« 回覆 #4 於: 2011-12-04 15:09 »
宣告是 int, 輸入時當成字串 => 沒有 segment fault 算運氣好吧.



確實會當掉!!如上圖,在mingw 裏run的效果!!

timloo

  • 懷疑的國中生
  • **
  • 文章數: 30
    • 檢視個人資料
    • http://pcteacher.com.tw/~tim
Re: 幫我看一下我寫的程式
« 回覆 #5 於: 2011-12-04 16:01 »
代碼: [選擇]
#include <stdio.h>
#include <string.h>
//char *username,*password,*a,*b;
#define LENGTH 10
int main(void)
{
char username[LENGTH],password[LENGTH],a[LENGTH],b[LENGTH];

printf("請設定您的帳號:");
scanf("%s",username);
printf("請設定您的密碼:");
scanf("%s",password);
printf("\n\n");
printf("請輸入你的帳號:");
scanf("%s",a);
printf("請輸入你的密碼:");
scanf("%s",b);
//if((username==a)&&(password==b))
 if ((strcmp(username,a)==0)&&(strcmp(password,b)==0))
   printf("帳號密碼正確,登入本系統");
 else
   printf("帳號密碼錯誤");
 return 0;
 system("pause");
}


(0 && 0) 的結果是0 ,所以
(strcmp(username,a))&&(strcmp(password,b))
得不到預期的效果,要改一下!!其他語言也許這樣寫就對了!!


原寫法
代碼: [選擇]
scanf("%s,password");

編譯不會報錯,比較奇怪的地方。

樓主的寫法,完全體現了C語言的字串特色(用char 的陣列表示string)。

而且延伸一下,測試一下,

如果

 char username[LENGTH],password[LENGTH],a[LENGTH],b[LENGTH],u[LENGTH],p[LENGTH];

把字串username 塞給 u,
把字串password塞給 p,

u = username;

p = password;

編譯就不過,
引用
pwd.c:11:3: error: incompatible types when assigning to type 'char[10]' from typ
e 'char *'
明明是同型別的東西,而c編譯器視為不同。   果然是強型別的語言啊!!

所以 用習慣C語言,就知道copy 字串,要用strcpy,拷貝字串, 其他語言的人,乍看之下,會以為寫錯了。
也可以看到一些語言,把這段差異,都在底層做掉了。

為了編譯能通過,

寫了,
 *u=*username;
 *p=*password;

很抱歉,這個意思,是只有拷過1個char,
代碼: [選擇]
username[0]過去,效果也不對。




以上在winxp 下的mingw 裏用gcc實作。



rhjyy

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
Re: 幫我看一下我寫的程式
« 回覆 #6 於: 2012-03-13 18:52 »
宣告是 int, 輸入時當成字串 => 沒有 segment fault 算運氣好吧.



確實會當掉!!如上圖,在mingw 裏run的效果!!

台灣也有人用迅雷的嗎?