

文字列の比較で、
文字列の長さが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);
}

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

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.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;
}
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Cで「大文字、小文字の判定」は...
-
1行の文字列を時間差で表示する...
-
str[j++]の意味
-
putsとputcharの違い?
-
sscanfとscanfの違いがよくわか...
-
C言語 空白の行(改行のみ)が...
-
fgets関数を使用したときの文字...
-
C言語のステップ数をカウントす...
-
C言語の課題です
-
C言語の勉強しています。すみま...
-
gets fgetsについて
-
fgetsで拾われる改行文字を削除...
-
sscanfの使い方
-
「Aに対するBの割合」と「Aに対...
-
C言語での引数の省略方法
-
DWORDの実際の型は何でしょうか
-
複数桁10進数の*桁目だけを抽出...
-
プログラムでの数字につく”f”の...
-
静的でないメンバ関数の呼び出...
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
C++
-
C/C++言語で日本語処理
-
C言語 空白の行(改行のみ)が...
-
CStringについて
-
小文字のみを数える方法
-
教えていただけませんか?C言語...
-
ブランクのチェック
-
str[j++]の意味
-
初歩的なプログラムなんですが...
おすすめ情報