• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 strlen 再入力を促す)

C言語のstrlen関数を使用して、文字列の長さが60以上の場合に再入力を促す方法

このQ&Aのポイント
  • C言語のstrlen関数を使用して、文字列の長さが60以上の場合に再入力を促す方法を教えてください。
  • また、このプログラムでは、文字列Aと文字列Bを比較し、どちらが大きいか、小さいか、または等しいかを判定しています。
  • しかし、意図しない動作が発生しています。どのように修正すれば良いでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • V36GTR
  • ベストアンサー率34% (17/49)
回答No.4

こんばんわ コンパイラの種類によっては、バッファを確保時にゼロクリアしないものもありますので、 バッファを確保した場合は、必ず、バッファをクリアすることをお勧めします。 入力文字列は、80文字以内ですが、入力された文字列の最後のNULLが、 保障されていないため、strlenや、compareで、バッファオーバーランを起こしている可能性があります。 上記問題は、compare内部で、while の前で、printf()で、それぞれの、文字列を表示してみることで、 確認できると思います。 もし、バッファクリアの問題であれば、解決方法としては、単純に、 char moji1[100]={0}; char moji2[100]={0}; でOKだと思います。 また、80文字未満で入力した場合に、最初のenterキーが無視される可能性もあるので、 ご参考までに、scanfの説明のURLをつけておきます

参考URL:
http://ja.wikipedia.org/wiki/Scanf

その他の回答 (4)

  • V36GTR
  • ベストアンサー率34% (17/49)
回答No.5

#4です。 ふと、思い出して、見てみると・・・駄目ですね、私のサンプル^^; while(strlen(moji1)>60){ は、 while(*moji1 == '\0' || strlen(moji1)>60){ にしてください。つまり、ゼロクリアした後に、1文字目が、NULLか、 または、長さが60文字を超える場合には、ループに入ると思います。同様に、 while(*moji2 == '\0' || strlen(moji2)>60){ となると思います。不十分で済みませんでした。m(_ _)m

回答No.3

  return (*x-*y); は、 return (unsigned char)*x - (unsigned char)*y;  

回答No.2

#include <stdio.h> #include <string.h> #define MAX 64 int get_str(char str[], int n) { char *p; if(!fgets(str, n, stdin)) return 0; if(p = strchr(str, '\n')) *p = '\0'; else{ int c; while((c = getchar()) != '\n' && c != EOF) ; } return 1; } int main(void) { char s[MAX]; while(1){ printf("文字列Aを入力===>"); if(!get_str(s, MAX)) break; if(strlen(s) < 60) break; puts("文字多すぎ、再入力"); } return 0; }

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

#include <stdio.h> #include <string.h> static int g_debug = 1; static void debug(char *message) {   if (g_debug) {     printf("DEBUG - %s\n", message);   } } int main(void) {   char moji1[100];   char moji2[100];   char buffer[1000]; /*   while(strlen(moji1)>60){ ← ×初期化していない変数を参照してはいけません。     printf("文字列Aを入力===>"); scanf("%80s" ,moji1);   }   while(strlen(moji2)>60){ ← ×初期化していない変数を参照してはいけません。     printf("文字列Bを入力===>"); scanf("%80s" ,moji2);   } */   do {     printf("文字列Aを入力===>"); scanf("%80s" ,moji1);   } while(strlen(moji1) > 60);      do {     printf("文字列Bを入力===>"); scanf("%80s" ,moji2);   } while(strlen(moji2) > 60);      /*    * 確認の為moji1、moji2を表示    */   if (g_debug) {     sprintf(buffer, "moji1{%s}", moji1);     debug(buffer);     sprintf(buffer, "moji2{%s}", moji2);     debug(buffer);   }      if(compare(moji1,moji2)>0){     printf("===AはBより大きい===\n");   } else if(compare(moji1, moji2)<0){     printf("===AはBより小さい===\n");   } else if(compare(moji1, moji2)==0){     printf("===AとBは等しい===\n");   }      return 0; } int compare(char *x, char*y) {   while(*x==*y && *x!=0){     x++;     y++;   }      return (*x-*y); }

関連するQ&A