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

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

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

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

文字コード

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

Q&A

解決済

4回答

1430閲覧

文字列が一致している判定がわからない。

langhtorn

総合スコア104

C

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

文字コード

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

0グッド

0クリップ

投稿2020/07/16 03:19

###実現したいこと
入力した文字列において一致する文字の数を求める。
###問題点
1つめの実行結果と3つめの実行結果が間違っている。
s[7]'\0'だと思います。それが判定に入らないようにif(s[i]!='\0')にしましたができませんでした。
実行結果

s : Abcdefg t : tochori s[2] t[2] s[7] t[7] Answer: 2 --------------- s : ABCDE t : aABCDE Answer: 0 --------------- s : Ab43 t : cd13 s[3] t[3] s[4] t[4] Answer: 2

###コード

C

1//文字列の比較2 2 3#include<stdio.h> 4 5int main(void) 6{ 7 char s[21],t[21]; 8 int i=0; 9 int cnt=0; 10 printf("s : "); 11 fgets(s,21,stdin); 12 printf("t : "); 13 fgets(t,21,stdin); 14 while(t[i]!='\0'){ 15 if(s[i]==t[i]){ 16 if(s[i]!='\0'){ 17 printf("s[%d] t[%d]\n",i,i); 18 cnt++; 19 } 20 } 21 i++; 22 } 23 printf("Answer: %d\n",cnt); 24 25 return 0; 26}

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

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

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

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

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

guest

回答4

0

ベストアンサー

他に回答がありますが、入力した文字列の最後に改行コードがあるため余計にカウントされていますね。
対策としては2つ。

入力文字列から改行文字を削除(NULL文字に変換)してから比較する。
または比較するときに改行コードを除外する。

で、手っ取り早いのは後者で、if文を次のようにすればよいかと。

c

1if(s[i]!='\0'){ 2 ↓ 3if(s[i]!='\0' && s[i]!='\n'){

投稿2020/07/16 04:27

ttyp03

総合スコア16998

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

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

langhtorn

2020/07/16 14:26

見えない改行コードがあるのですね。よくわかりました。ありがとうございます。
guest

0

なぜにすべてをmainに詰め込もうとするんだろう。
やりたいことを関数で表現し、mainはそれ呼ぶだけにすればいいのに。

C

1#define _CRT_SECURE_NO_WARNINGS // disable warning (only for Visual C++) 2#include <stdio.h> 3#include <string.h> 4 5// 一致する文字の数を返す 6int count_same(const char* s, const char* t) { 7 int count = 0; 8 // 両者共に終端に達していない間くりかえす 9 // (どっちかが終端ならloopを抜ける) 10 while ( *s != '\0' && *t != '\0' ) { 11 // 一致したら count +1 12 if ( *s == *t ) { 13 ++count; 14 } 15 ++s; // 次の文字 16 ++t; // 次の文字 17 } 18 return count; 19} 20 21// 末尾の改行文字を、あれば(あるけど)取り除く 22void trim_lf(char* s) { 23 char* p = strchr(s, '\n'); 24 if ( p != NULL ) *p = '\0'; 25} 26 27int main(void) { 28 char s[21], t[21]; 29 int cnt = 0; 30 31 printf("s : "); 32 fgets(s, 21, stdin); 33 trim_lf(s); 34 35 printf("t : "); 36 fgets(t, 21, stdin); 37 trim_lf(t); 38 39 cnt = count_same(s, t); 40 printf("Answer: %d\n", cnt); 41 42 return 0; 43}

投稿2020/07/16 03:37

編集2020/07/16 03:38
episteme

総合スコア16614

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

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

langhtorn

2020/07/16 14:28

関数バージョンも作ってみます。ありがとうございます。
episteme

2020/07/16 14:33

いやホント疑問なんだけど、なぜにすべてをmainに詰め込もうとするんです? ひとつのことを確実に行う部品を作り、それらを組み上げたほうがずっと楽じゃないんですか?
guest

0

if(s[i]==t[i]){

if(s[i]!='\0'){ printf("s[%d] t[%d]\n",i,i); cnt++; }

文字を比較して同一ならprintfを実行してますが、それは意図した動作なんでしょうか。


s : Ab43

t : cd13
s[3] t[3]
s[4] t[4]
Answer: 2

これ、双方の文字列の後尾にスペースが入ってるのでは。

投稿2020/07/16 03:23

編集2020/07/16 03:28
y_waiwai

総合スコア87747

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

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

episteme

2020/07/16 03:40

fgetsで読んでるから、ケツに改行があるせいですきっと。
langhtorn

2020/07/16 14:28

見えない部分にこれから気を付けます。ありがとうございます。
guest

0

C

1//文字列の比較2 2 3#include<stdio.h> 4 5int main(void) 6{ 7 char s[21],t[21]; 8 int i=0; 9 int cnt=0; 10 printf("s : "); 11 fgets(s,21,stdin); 12 printf("t : "); 13 fgets(t,21,stdin); 14 while(t[i]!='\0'){ 15 if(s[i]==t[i]){ 16 if(s[i]!='\0'&&s[i]!='\n'){ 17 //printf("s[%d] t[%d]\n",i,i); 18 cnt++; 19 } 20 } 21 i++; 22 } 23 printf("Answer: %d\n",cnt); 24 25 return 0; 26} 27 28/*実行結果 29s : Imahori 30t : teacher 31Answer: 1 32------------ 33s : ChuoUniv2020 34t : student123456 35Answer: 3 36------------------ 37s : ABCDE 38t : aABCDE 39Answer: 0 40*/

投稿2020/07/16 14:29

langhtorn

総合スコア104

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問