質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

3回答

1159閲覧

文字が打てなくなる原因がわからない。

langhtorn

総合スコア104

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/07/14 16:33

###実現したいこと
2つの文字列を入力して比較する。
###問題点
sは順調に入力できるのだがtをいれようと思ったら、入力できなくなる。
その原因を教えてください。

文字列を入力してください s: AbcDe t:         <-ここで文字が打てなくなる

###コード

C

1//文字列の比較1 2 3#include<stdio.h> 4#include<ctype.h> 5 6int main(void) 7{ 8 char s[5],t[5]; 9 printf("文字列を入力してください\n"); 10 printf("s: "); 11 fgets(s,5,stdin); 12 printf("t: "); 13 fgets(t,5,stdin); 14 15 int cnt,cnsup,cnlow,cdiff=0; 16 int i; 17 while(1){ 18 if(s[i]==t[i]){ //小文字大文字もすべて一致 19 cnt++; 20 } 21 if(isupper(s[i])){ //s[i]が大文字でt[i]が小文字の時 22 if(islower(t[i])){ 23 cnsup++; 24 } 25 } 26 if(islower(s[i])){ //s[i]が小文字でt[i]が大文字の時 27 if(isupper(t[i])){ 28 cnlow++; 29 } 30 } 31 if(s[i]!=t[i]){ //もはや文字が違う時 32 cdiff++; 33 } 34 } 35 if(cnt==5){ 36 printf("same\n"); 37 }else if(cnsup>0||cnlow>0){ 38 printf("case-insensitive\n"); 39 }else if(cdiff>0){ 40 printf("differnt\n"); 41 } 42 43 return 0; 44}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

取得する行の最大文字数 (fgets の第二引数)が小さすぎて次の fgets が実行されちゃって次の変数の方に入っちゃってます。文字列の長さ + 改行コード + \0 で 7(以上)にしたらとりあえず動くと思いますが、

c

1fgets(s, 7, stdin);

バッファも含めて余裕を持った数にした方がいいと思います。

投稿2020/07/14 17:03

bboydaisuke

総合スコア5275

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

langhtorn

2020/07/15 12:44

長さ5の文字が入力したかったので7がちょうどよかったです。ありがとうございます。
guest

0

sは順調に入力できるのだがtをいれようと思ったら、入力できなくなる。

fgets(s,5,stdin);sには"AbcD"が格納され(第2引数に指定するサイズは'\0'を格納するための領域も含む)、
fgets(t,5,stdin);tには残りの"e\n"が格納されるためです。


cnt,cnsup,cnlow,iが不定値のまま使用されています。
大文字と小文字であれば別の文字でも、cnsupcnlowを加算しています。

投稿2020/07/14 16:54

編集2020/07/14 17:08
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

langhtorn

2020/07/15 12:43

理由がよくわかりました。ありがとうございます。
guest

0

ベストアンサー

配列sは大きさ5の配列ですね。
fgets実行時、配列sに入る文字列の長さは、4文字です。終端のヌル文字も含めて5文字分になるので。
提示されている例だと「AbcD」までがsに入れられて、fgetsが終了します。

では、残りの「e」と、入力を終えるための改行はどこに入るのかというと、次のfgets実行時に、配列tに入ります。提示されている例だと「e」と改行と終端のヌル文字がtに入っています。

ということで、最初に入力した文字列が配列stに分割して格納されるので、そのまま2回目のfgetsも終了してしまいます。対策としては、配列の大きさを十分に大きくしてください。

そこから後のコードも突っ込みたいのですが、質問にないので省略いたします。

投稿2020/07/14 16:48

編集2020/07/14 22:36
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

langhtorn

2020/07/15 12:42

そうですね。見えてない部分があるのですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問