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

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

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

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

Q&A

4回答

854閲覧

2つの言葉を入力して同じかどうかを判定するプログラム

ex_nh0

総合スコア7

C

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

0グッド

0クリップ

投稿2020/01/22 13:35

前提・実現したいこと

2つの言葉を入力してその言葉が同じであればidebtical,ちがっていればdifferentと出力する
プログラムを作っています。

発生している問題・エラーメッセージ

Segmantation fault

該当のソースコード

#include<studio.h> int identical(char *word_a,char *word_b) { int i; while(word_a[i] != '\0' && word_b[i] != '\0'){ if(word_a[i] = word_b[i]){ return 1; break; } i++ } return 0; } int main(void) { char *word_a[100],char *word_b[100]; int han; printf("input a word :"); scanf("%99s",word_a); printf("input a word :"); scanf("%99s",word_b); han = identical(*word_a,*word_b); if(han == 0){ printf("different\n"); }else if(han ==1){ printf("identical\n"); } return 0; }

補足情報(FW/ツールのバージョンなど)

identical関数がなければできるため、identical関数がある状態でどうやってやるのかが
知りたいです。何かきずいたことがあれば教えてください。

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

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

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

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

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

otn

2020/01/22 13:43

> char *word_a[100] は、何を宣言しているつもりですか? そもそも、このプログラムだと、コンパイルエラーになります。 コピペするプログラムを間違えてますね。実行したプログラムに置き換えてください。
nanami12

2020/01/23 01:43

2つの文字列を比較する標準関数をご存知ですか?
guest

回答4

0

勉強がてらで書いてみました。

cコード

1#include <stdio.h> 2 3int identical(char *word_a, char *word_b) 4{ 5 while(*word_a != '\0' || *word_b != '\0'){ 6 if(*word_a != *word_b) 7 return 1; 8 word_a++; 9 word_b++; 10 } 11 return 0; 12} 13 14int main(void) 15{ 16 char word_a[100]; 17 char word_b[100]; 18 19 printf("input a word :"); 20 scanf("%99s", word_a); 21 22 printf("input a word :"); 23 scanf("%99s", word_b); 24 25 if(identical(word_a, word_b)){ 26 printf("different\n"); 27 }else{ 28 printf("identical\n"); 29 } 30 return 0; 31} 32

投稿2020/01/23 00:51

amura

総合スコア333

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

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

fana

2020/01/23 01:38

質問者のコードのidentical()の戻り値の利用部分から,identical()の戻り値の仕様が(一致のとき1, 不一致のとき0なのだと)推測できますが… それに対して,あえて仕様が異なる形のコードを示すのであれば,その旨を一言添えた方が無用な混乱を抑制できるのではないかと思います. (わざとやってるのかもしれませんが)
guest

0

Segmentatin Fault が起きる前に、そもそもこのプログラムはコンパイルできない(コンパイルエラーが発生する)と思いますが、きちんとコンパイルは通りましたか?

c

1#include<studio.h>

これは

c

1#include<stdio.h>

の間違いですね(studioという間違いは意外に多いのですが)。

c

1int identical(char *word_a,char *word_b) 2{ 3 int i; 4 5 while(word_a[i] != '\0' && word_b[i] != '\0'){ 6 if(word_a[i] = word_b[i]){ 7 return 1; 8 break; 9 } 10 i++ 11 } 12 return 0; 13}

while()の条件式がおかしくありませんか?

他の方も指摘されているように、変数iが初期化されないまま使われています。

if()文の中の比較式が代入になっていますね。
おそらく、二つの変数の値が等しいならば、というつもりで書かれたと思いますが、アルゴリズムとしてはそれで大丈夫でしょうか?
このままだと、文字列の一番目の要素を比較し、それが2つの文字列で同じならば判定終了になってしまいます。

c

1int main(void) 2{ 3 char *word_a[100],char *word_b[100]; 4 5 int han; 6 7 printf("input a word :"); 8 scanf("%99s",word_a); 9 10 printf("input a word :"); 11 scanf("%99s",word_b); 12 13 han = identical(*word_a,*word_b); 14 15 if(han == 0){ 16 printf("different\n"); 17 }else if(han ==1){ 18 printf("identical\n"); 19 } 20 return 0; 21}

これも他の方が指摘されていますが、変数宣言でのword_a,word_b両変数とも、アスタリスクは不要です。

また、変数をidentical()に渡す際もアスタリスクは不要です。

投稿2020/01/22 14:04

TsukubaDepot

総合スコア5086

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

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

0

int i;

iが初期化されていません。

if(word_a[i] = word_b[i]){

これは間違いを含んでいるのでよく条件式について復習するとよいでしょう。

char *word_a[100],char *word_b[100]; han = identical(*word_a,*word_b);

*が不要です。

投稿2020/01/22 13:43

編集2020/01/22 13:47
asm

総合スコア15147

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

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

0

identical関数がなければできるため

標準関数でstrcmpが存在します。(学習目的などでないなら)自分で作る必要はありません。

投稿2020/01/22 13:42

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問