• 締切済み

c言語 文字列の比較

ファイルから読み込んだ文字列と入力した文字列を比較して同じなら次の処理を行いたいんですが、入力が例えば同じ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が一行はいっています。 自分では全く見当がつかないので、回答していただける方がいれば、ヒントでもいいのでお願いします。

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.7

strcat(pass,"\n"); 改行をつける理由は? data.txtが改行で終わってないのでは

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.6

>cは char c; で宣言しています。 それだと、コンパイルが通りません。 コンパイルが通っているソースを、そっくりそのまま コピー&ペーストして載せてくださいますか? それが、質問者さんと回答者とのコミュニケーションの出発点です。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

#3さんの >まず、いきなり出てくる変数cはどこで定義していますか? と同じ疑問があります。 載せていただいたコードを手元のgccでコンパイルしたところ、 >c=smsg; この行で「cを定義せずに使っている」という内容のエラーが出ました。 お手元にあるコードではコンパイルエラーが出ないのですか?

kuhorin
質問者

補足

cは char c; で宣言しています。strcmp()での比較がうまくいかないのでいろいろいじってたときの名残です。すいません・・・ ご指摘ありがとうございます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

できれば、コードの断片でなく、回答しようとする人が 自分のところで何も手を加えずにコンパイルできるような コードを載せていただけますか?

kuhorin
質問者

補足

見ていただいたのに、返事がおそくなってすいません。 こういった場で質問を載せるのは初めてで、失礼もあると思いますが、 そういったところも注意していただけると助かります。 今回質問でのせたプログラムは、ネットワークプログラミングで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); }

  • lucenter
  • ベストアンサー率0% (0/1)
回答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言語を初歩から学びなおすことをお勧めいたします。

kuhorin
質問者

補足

すいません。記載不足で返答にも困られたと思います。 こんかい質問させていただいた内容は、書いていただいたとおりです。 どうも、コマンドで入力したものと、行から読み込んだものでコマンドには同じ表示で出るのですが、strcmp()で比較するとだめみたいです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

処理系も詳細な状況も不明なので正確なことはわかりませんが... > 入力が例えば同じ1212でもstrcmp()で181がかえってきます。 この質問文から推測するに、全角と半角が混在しているということはないですか?

kuhorin
質問者

補足

読み込むファイルのデータでは確かに半角でした。 コマンドでも何回も確かめたので半角同士になっているとは思うのですが・・・。

  • ushioni
  • ベストアンサー率24% (14/58)
回答No.1

改行コードが怪しいですが・・・ 見当がつかない場合は、見て比較するのが良いです。 例えば、 for (i = 0; i < BUFMAX; i++) { printf("%d : %02x %02x\n", i, smsg[i], pass[i]); } みたいなのをいれれば多分、一発で解決しそうですよ。

kuhorin
質問者

お礼

回答ありがとうございます。 補足でつけさしていただいた文に間違いがあったので訂正も載せさせていただきます。strlen() -> strncmp()でした。失礼しました。

kuhorin
質問者

補足

一応コマンド上では確認したのですが、どうもだめみたいです。 ほかにもstrnlen()?を使いましたがn=1としてもだめでした。 strnlen()の比較はだめなんでしょうか?