ファイルから読み込んだ文字列と入力した文字列を比較して同じなら次の処理を行いたいんですが、入力が例えば同じ1212でもstrcmp()で181がかえってきます。原因は何なのでしょうか?
#define BUFMAX=45;
char smsg[BUFMAX];
char pass[BUFMAX];
printf("pass=%s\n",pass);
printf("smsg=%s\n",smsg);
c=smsg;
stc=strcmp(pass,c);
passにはscanfで1212を読み込みます。
smsgにはfgetsでファイルから一行読み込みます。
テキストのなかみは1212が一行はいっています。
自分では全く見当がつかないので、回答していただける方がいれば、ヒントでもいいのでお願いします。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
>cは char c; で宣言しています。
それだと、コンパイルが通りません。
コンパイルが通っているソースを、そっくりそのまま
コピー&ペーストして載せてくださいますか?
それが、質問者さんと回答者とのコミュニケーションの出発点です。
No.4
- 回答日時:
できれば、コードの断片でなく、回答しようとする人が
自分のところで何も手を加えずにコンパイルできるような
コードを載せていただけますか?
この回答への補足
見ていただいたのに、返事がおそくなってすいません。
こういった場で質問を載せるのは初めてで、失礼もあると思いますが、
そういったところも注意していただけると助かります。
今回質問でのせたプログラムは、ネットワークプログラミングでTCPを使った課題の一部分です。サーバーでパスワード1212をいれたファイルを用意し、クライアント側でパスワードを入力、パスワードが正しければ、サーバーから情報を送るようにしたい、というものです。課題の途中でどうしても困り質問したものですので、まだ情報のやり取りはほとんどできていません。
とりあえず、サーバーのプログラムだけ貼ります。長いので
内容は見づらいと思いますが、アドバイスがあればお願いします。
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<stdio.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#define BUFMAX 45
#define PORT_NO 8001
static char rmsg[10],smsg[BUFMAX];
static int sofd,nsofd;
struct sockaddr_in sv_addr,cl_addr;
static struct hostent *shost;
static char shostname[10];
int serv_program();
main(int argc,char **argv){
socklen_t cadlen;
if((sofd=socket(AF_INET,SOCK_STREAM,0))<0)
printf("Error1 s\n");
if(gethostname(shostname,sizeof(shostname))<0)
printf("Error2 s\n");
shost=gethostbyname(argv[1]);
if(shost==NULL)
printf("Error s:gethostbyname");
memset(&sv_addr,0,sizeof(sv_addr));
sv_addr.sin_family=AF_INET;
sv_addr.sin_port=htons(PORT_NO);
memcpy((char *)&sv_addr.sin_addr,(char *)shost->h_addr,shost->h_length);
if(bind(sofd,(struct sockaddr *)&sv_addr,sizeof(sv_addr))<0)
printf("Error s:bind\n");
if(listen(sofd,5)==-1)
printf("Error s:listern\n");
while(1){
cadlen=sizeof(cl_addr);
if((nsofd=accept(sofd,(struct sockaddr *)&cl_addr,&cadlen))<0)
printf("Error s:accept\n");
if(fork()==0)
serv_program();
close(nsofd);
}
}
serv_program(){
int cc,cl_addr,len,nbyte;
char pass[BUFMAX];
int i=1;
int stc;
char txt[BUFMAX];
FILE *fp;
close(sofd);
if(recv(nsofd,rmsg,10,0)<0)
printf("Error s:recv\n");
fp=fopen("data.txt","r");
nbyte=strlen("stat ");
send(nsofd,"start ",nbyte,0);
/***************この下部分が分かりません。*********************/
while(1){
fgets(smsg,BUFMAX,fp);
recv(nsofd,pass,BUFMAX,0);
strcat(pass,"\n");
printf("pass=%s\n",pass);
printf("smsg=%s\n",smsg);
c=smsg;
stc=strcmp(pass,c);
/*****最初の質問はここから上の部分です**************/
if(strcmp(pass,smsg)==0){
printf("input\n");
break;
}
}
printf("out\n");
while(fgets(smsg,BUFMAX,fp)!=NULL){
printf("in\n");
nbyte=strlen(smsg);
if(send(nsofd,smsg,nbyte,0)<0)
printf("Error s:send\n");
}
fclose(fp);
if(shutdown(nsofd,2)<0)
printf("Error s:shutdown\n");
close(nsofd);
exit(0);
}
No.3
- 回答日時:
まず、いきなり出てくる変数cはどこで定義していますか?
その使用方法でのcは
char *c;
で定義していますか?
おそらくやりたいことは
#include <stdio.h>
#include <string.h>
#define BUFMAX 45
void main(void){
char smsg[BUFMAX];
char pass[BUFMAX];
FILE *fp;
fp = fopen("filename.txt","r");
scanf("%s",pass);
fgets(smsg,BUF-1,fp);
if(strcmp(pass,smsg) == 0){
puts("同一");
}else{
puts("相違");
}
}
ではないでしょうか?
#defineの使い方も間違えていますのでC言語を初歩から学びなおすことをお勧めいたします。
この回答への補足
すいません。記載不足で返答にも困られたと思います。
こんかい質問させていただいた内容は、書いていただいたとおりです。
どうも、コマンドで入力したものと、行から読み込んだものでコマンドには同じ表示で出るのですが、strcmp()で比較するとだめみたいです。
No.1
- 回答日時:
改行コードが怪しいですが・・・
見当がつかない場合は、見て比較するのが良いです。
例えば、
for (i = 0; i < BUFMAX; i++) {
printf("%d : %02x %02x\n", i, smsg[i], pass[i]);
}
みたいなのをいれれば多分、一発で解決しそうですよ。
この回答への補足
一応コマンド上では確認したのですが、どうもだめみたいです。
ほかにもstrnlen()?を使いましたがn=1としてもだめでした。
strnlen()の比較はだめなんでしょうか?
回答ありがとうございます。
補足でつけさしていただいた文に間違いがあったので訂正も載せさせていただきます。strlen() -> strncmp()でした。失礼しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
エクセルVBAではRound...
-
Microsoft Visual Sutudio 6.0...
-
コンパイルエラー
-
cygwinのgccが、エラーになって...
-
「外部シンボル '__inp' が未解...
-
Visual Strudio 2012でXPアプリ
-
1 つ以上の複数回定義されてい...
-
GDL(GCC DEVELOPER LITE)の...
-
ILSpyで、デコンパイルできない。
-
アプリケーションの配布
-
外部シンボル "_main"は未解決です
-
ビルドとリビルドの違いを教え...
-
python エラー
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
Excelのエラーで困ってます。
-
ソフトの開発言語を調べる方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
” OS ビルド ” の意味が分か...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
エクセルVBAではRound...
-
Makefile作成時の拡張子.oとは?
-
C言語でヘッダファイルにグロー...
-
ILSpyで、デコンパイルできない。
-
セミコロンについて
-
<math.h>があるのにsqrtが・...
-
クリティカルエラー Expressio...
-
外部シンボル "_main"は未解決です
-
マクロ コンパイルがグレーバック
-
[c++] <pthread.h>がinclude で...
-
C++コンパイル時に『 C1083: in...
-
【VC++6.0(MFC)】警告「LINK : ...
-
ビルドとリビルドの違いを教え...
-
コンパイルエラー:ユーザ定義...
-
VB6で開発中…標準モジュール間...
-
コンパイル??
おすすめ情報