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

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

C言語 strlen 再入力を促す

文字列の比較で、 文字列の長さが60以上の時、再入力を促します。 while文を使って書いてみたのですが、 文字列Bの入力の前に、もう一度意味もなく 「文字列Aを入力===>」が表示されたり。 文字列Aのほうが小さいのに「Aのほうが大きい」と 表示されるようになったり、変な感じです。 どなたかご指摘・ご指導のほどよろしくお願いします。 int main(void) { char moji1[100]; char moji2[100]; while(strlen(moji1)>60){     printf("文字列Aを入力===>"); scanf("%80s" ,moji1); } while(strlen(moji2)>60){     printf("文字列Bを入力===>"); scanf("%80s" ,moji2);    } 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); }

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

  • ベストアンサー
  • 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

  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • c言語の文字列の逆順のプログラムがわかりません

    文字列を逆順して出力するプログラミングがわかりません。 #include <stdio.h> #include <string.h> void reverse(char *moji, char *gyaku); int main(void) { char x[30]; char y[30]; puts("文字を入力してください。\n"); scanf("%s", x); reverse(x, y); printf("逆順すると%sです。\n", y); return (0); } void reverse(char *moji, char *gyaku) { int i, len; len = strlen(moji); gyaku = moji + len - 1; for(i = 0; i < len; i ++){ putchar((int)*gyaku); gyaku--; } } 理想とする実行結果は 文字を入力してください。 abcdefg 逆順するとgfedcbaです。 なんですが、 上記のソースを実行すると 文字を入力してください。 abcdefg gfedcba逆順すると(謎の漢字)です。 となります。 どこがおかしいんでしょうか? よろしくおねがいします。

  • C言語

    forの直後で1+2+3+4+5+・・・・・・・と加算し続ける式がわからないので教えてください。 #include<stdio.h> int main(void) { char moji; int i,sum; printf("正の整数を1から順に加算します。n\"); printf("加算を開始してよろしいですか。(Y=実行。N=終了)\n"); moji=getchar(); if(moji==y) { for(i=2;sum>=1001;i++) { この部分がわかりません; printf("加算値は%dです。¥n",sum); } }else if(moji=='n'){ printf("終了します。\n"); }else{ printf("YまたはNを入力してください。\n"); } return 0; }

  • c言語の難しい問題について

    (c言語の問題) 下記のプログラムを完成させ、キーボードから文字列を読み込み、-1文字ずらすことによって暗号化を行うプログラムを作りなさい。ただし、ピリオド、空白などはそのままにするようにすること。 例)this is a pen. sghr hr @ qdm. #include<stdio.h> #define CHAR_NUM 256 void angou( I ) { II } int main(void) { unsigned char text[CHAR_NUM]; char moji; int i; puts("暗号化する文字を入力しなさい。"); while((moji=getchar()) !=EOF){ text[i]=moji; i++; } angou(text i); printf("%s",text); return(0); } I、IIに入る文を書きなさい。 私はIには「char x[],int y」 IIには 「if('A'<x[i]<'Z' && 'a'<x[i]<'z') int j; for(j=0;j<y;j++) x[j]=x[j]-1 else」 といれたのですが、出力がうまくでません。どうすればいいのですか?

  • strlen

    c言語初心者です。 10文字以上入力すると警告してくれるプログラムを考えています。 一応文字数を制限するにあたりstrlenを使おうとしてるのですが 思ったように機能してくれません。 以下が私の書いたプログラムです。 void main() { char name[10]={0}; memset( name, '\0', sizeof(name) ); loop: puts("*****登録*****"); printf(" 名前 :"); fgets(name,10,stdin); //バッファクリア**// if(strchr(name,'\n') == NULL) { while(getchar() != '\n'); } if(strlen(name)>10) { puts("<<文字入力数が多すぎです>>"); fgets(name,10,stdin); //バッファクリア**// if(strchr(name,'\n') == NULL) { while(getchar() != '\n'); } system("cls"); goto loop; } else { puts("OK"); } } よろしくお願いします。

  • C言語

    文を繰り返すときに、『続けますか(Y=続行。N=終了)』と表示して、Yが入力されたら文を繰り返すようにしたいのですが、わからないので教えてください。 #include<stdio.h> int main(void) { int m,s,r,num; char moji; num=1; do{ printf("距離を入力してください。\n"); scanf("%d",&m); printf("平均速度を入力してください。\n"); scanf("%d",&s); r=m/s; printf("所要時間は%dです。\n",r); printf("続けますか?(Y=続行。N=終了)\n");/*このあたりがどうすればいいのかわかりません*/ moji=getchar(); }while(num) printf("終了します。\n"); return 0; }

  • C言語での質問です。

    何か文字を打ち、その後鍵(整数)を入力します。 すると、元の文字が暗号化されて表示。 というプログラムを作っています。 暗号化の具体的な方法は、 (1)、元の文を鍵の整数で分けます。 例:元の文「aiueo」鍵「2」→「ai」「ueo」 (2)、そして、分けた文を混ぜます。 文字数が多い方を先に混ぜていきます。 「ai」「ueo」→「uaeio」 (3)、この混ぜた文を暗号文として出力。 という感じのプログラムを作りたいのですが、上手く混ざらず困っています。 出力された時、上手く混ざってなかったり文字化けしてるような文字が出てきたりなど。 ソースは↓です。 #include<stdio.h> #include<string.h> int main(void) { char word[256]; char angou[256]={0}; char kari[1][256]={0}; int key,i,n,a=0,b,mae,ushiro; printf("単語を入力してください。:\n"); scanf("%s",word); printf("鍵となる整数を入力してください。:\n"); scanf("%d",&key); n=strlen(word); i=0; while(i<=key-1){ kari[0][i]=word[i];/*keyの文字数までの文字を入れる。*/ i++; } while(key-1<=n){ kari[1][a]=word[i];/*keyの文字数から最後までの文字を入れる。*/ a++; i++; } i=0; a=0; mae=strlen(kari[0]); ushiro=strlen(kari[1]); if(mae>=ushiro){/*どちらの方が文字数が多いかを比べる。*/ for(b=0;b<=n;b++){ if(b%2){ angou[b]=kari[1][a];/*奇数の時、文字数が少ない方を入れる。*/ a++; } else{ angou[b]=kari[0][i];/*偶数の時、文字数が多い方を入れる。*/ i++; } } } else if(mae<ushiro){ for(b=0;b<=n;b++){ if(b%2){ angou[b]=kari[0][a]; a++; } else{ angou[b]=kari[1][i]; i++; } } } printf("暗号文は%sです。\n",angou); return(0); } 何がおかしいでしょうか?

  • C言語のプログラムです。

    次のようなプログラムを作成しようと考えています。 1.文字列を入力し、入力した文字列にアルファベット以外の文字が含まれていたら再入力。 2."end"もしくは"END"が入力されたらプログラム終了。 3.main関数とは別の関数で入力した文字列に現れる文字を全て入力順に大文字で表示する。(小文字と大文字は同じ文字として扱い、出現個数も合わせて表示する) ※2.では文字列を比較するstrcmpを使用。 表示結果例)  入力:DxbhzAeFSXY  出力:D=1,X=2,B=1,H=1,Z=1,A=1,E=1,F=1,S=1,Y=1 (応用)3.では入力順に表示させていたが、アルファベット順に結果を表示する。 上記の2.までのプログラムは作成できたのですが、3.及び応用が分からず大変困っています。 どなたかご教授ください。 #include <stdio.h> #include <string.h> int sub(int ss[i],int n){ int x; for(x=1; x<=n; x++){ //小文字を大文字に変換 if(ss[i]>=97){ ss[i]=ss[i]-32; } } } int main(void){ char ss[80]; char sa[2][4]={{\"end\"},{\"END\"}}; int a, i, n; int flag= 0; //アルファベット以外の入力があった際の判別 do{ printf(\"文字列を入力してください\\n\"); gets(ss); n= strlen(ss); //文字列ssの長さを求める if(n=3 && ((strncmp(ss,sa[0],3)==0)) || ((strncmp(ss,sa[1],3)==0))){ //endまたはENDの判定 return 0; } for(i=0; i<n; i++){ if((ss[i]>=65 && ss[i]<=90) || (ss[i]>=97 && ss[i]<=122)){ } else{ flag=1; break; } } }while(flag=1); }

  • C言語での文字列ソート動作について

    任意の文字列を入力し、その文字列を昇順にソートするプログラムを作ったのですが、入力する文字の文字数が大きく異なると期待した結果が得られません。 文字数が少なくなったり、他の配列の文字が混ざったりと言う結果に成ってしまっています。 何が原因か分からない状態です。 以下にサンプルを記載させて頂きますので、助言よろしくお願いします。 /*----------------------------------------- 入力例 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBB AAAAAA -----------------------------------------*/ #include <stdio.h> #include <string.h> #include <stdlib.h> void swapc(char *cx , char *cy){ char tmp[100]; strcpy(tmp, cx); strcpy(cx, cy); strcpy(cy, tmp); } int main(){ char *num[100]; char str_tmp[100]; //文字列一時格納 int moji_cnt; //入力した文字列のカウント int n , m; // 文字列入力処理開始 printf("文字列を入力してください\n"); for( moji_cnt = 0 ; moji_cnt != 3 ; moji_cnt++){ scanf("%s", str_tmp); *(num+moji_cnt) = (char *)malloc(sizeof(char) * (strlen(str_tmp)+1)); //メモリ確保 strcpy(*(num+moji_cnt), str_tmp); } puts("\n"); // 文字数ソート処理 for(n = 0 ; n < moji_cnt-1 ; n++){ for(m = 1 ; m < moji_cnt-n ; m++){ if(strcmp(*(num+n) , *(num+n+m)) > 0){ swapc(*(num+n) , *(num+n+m)); // 文字列入れ替え } } } puts("\n"); for(n = 0;n != moji_cnt;n++){ printf("%s\n" , *(num+n)); } free(num); }

専門家に質問してみよう