“ログイン”が上手くできない – プログラミング – Home

“ログイン”が上手くできない
 
通知
すべてクリア

[解決済] “ログイン”が上手くできない


beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

開発環境“windowsXP professional SP2”visualC++6.0

ログインの遷移で困ってます。
ソースファイルにテキストファイル“password.txt”から
パスワードを持ってきて遷移させるのですがどうしても
elseで返され“messagebox”が表示されてしまいます。
何分初心者なものでよくわかりません。
どなたかご教授お願いします。
以下コードを記述します。
   ↓
void CTheENDDlg::OnLogin()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してくださ
FILE *fp;
char string[10];

fp = fopen(password.txt ,r);
fgets(string,10,fp);

fclose(fp);

if(string == m_message ) //パスワードが一致したら
{

ShowWindow(SW_HIDE);//画面非表示
Cend myDL; //次の画面呼び出し
myDL.DoModal();
EndDialog(SW_HIDE); //画面閉じる
}
else{
MessageBox ( パスワードが間違ってます);

}
}
**テキストファイル名は“password.txt”です。


引用未解決
トピックタグ
iijima
 iijima
(@iijima)
ゲスト
結合: 21年前
投稿: 44
 

> if(string == m_message ) //パスワードが一致したら

char型ポインタが指す文字列の比較は、==演算子ではできません。
この条件式は、左右辺の文字列を指すポインタの値が等しいときに真を返します。
文字列の比較については、strcmp関数を調べてください。


返信引用
iijima
 iijima
(@iijima)
ゲスト
結合: 21年前
投稿: 44
 

補足:
C++言語ならstringクラスが、また、MFC環境ならCStringクラスがあります。
それらのクラスオブジェクトとしての文字列なら、==演算子で比較できます。


返信引用
beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

iijima様ご回答ありがとうございます。
開発環境はMFCです。
strcmp関数を調べてみます。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

こういうときは、if文の前で両者を表示してみましょう。

m_messageがCStringであれば、==で比較できます。

それよりもstringの末尾に改行文字が付いているのかも・・


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

もしかしたら終端文字の領域がないのかもしれませんね。

>fgets(string,10,fp);
で10文字ちょうどの文字がとれるわけではないので。

例)
ファイルの内容
1234567890
の場合
stringには 123456789 という文字列が格納される。

でもやっぱりMFCつかっているならばCStdioFileとかを使ったほうがいいような。
# CStdioFileとかはマイナーなのかな。。。


返信引用
初心者たち
 初心者たち
(@初心者たち)
ゲスト
結合: 20年前
投稿: 4
 

あれっ、私はできましたけど・・・

何でかな!?

でも、初心者なので理由が分かりませ~ん(泣)


返信引用
beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

iijimaさんREEさん貴重なご意見ありがとうございました。
お二人のご教授により解決いたしました。


返信引用
beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

“初心者たち”さんあんまり責めないでください。
おかげさまで解決しました。
あっ!!Blueさんありがとうございました。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

どう解決したのか具体的な報告を期待します。

>“初心者たち”さんあんまり責めないでください。

別に責めているわけではないでしょう。

password.txtのパスワードの後に改行があるかないかで動作が変わったりしますので・・


返信引用
beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

REEさんもうしわけありません。
プログラムを何度書き直しても“ログイン”できない
ので“txtファイル”を作り直し、
ソースファイルも書き直しました。
REEさんがおっしゃるようにFileの後に
改行がったようです。
以下にソースファイル(修正版)を載せておきます
     ↓
void CTheENDDlg::OnLogin()
{
// TODO: この位置にその他の検証用のコードを追加してください

FILE *fp;//パスワードをテキストファイルから参照する。
char string[10];//配列を10確保

fp = fopen(password.txt ,r);//Fileを開く(読み込みのみ)
fgets(string,10,fp);//最初の10文字比較

fclose(fp);//Fileを閉じる

UpdateData(TRUE);//変数をダイアログに更新
if(string == m_message) //パスワードを認識する
{
ShowWindow(SW_HIDE); //ログイン画面を隠す
Cend myDL; //メニュー画面
myDL.DoModal( ); //メニュー画面を表示
EndDialog(SW_HIDE); //ログイン画面を消去
}
else{
MessageBox ( パスワードが間違ってます);//メッセージボックスの表示
}

}


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

将来、password.txtを編集した時にまちがって改行をいれても大丈夫なように、
fgetsの後で、stringから改行文字を取り除くようにした方がいいと思います。

一例:
char *enter = strchr(string, '\n');
if(enter != NULL)*enter = '\0';


返信引用
beginner
 beginner
(@beginner)
ゲスト
結合: 23年前
投稿: 63
Topic starter  

REEさんお度重なるお心遣い感謝いたします。
確かに“Text file”を編集するとき間違えないように
“ソースファイル”でコードを編集したほうがいいですね。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました