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

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

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

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

Q&A

3回答

3226閲覧

力任せ法による文字列探索

Cmasaru

総合スコア0

C

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

0グッド

1クリップ

投稿2021/05/02 13:06

前提・実現したいこと

C言語初心者です。現在は参考書を読みながら独学でC言語の学習をしています。
アルゴリズムの項目で力任せ法による文字列探索のコード作成を行っています。
具体的には文字列ABBBCCAAAとBCCAを入力したとき4文字目に見つかりましたと
出力されるように作成したと考えています。

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

Main.c:22:12: warning: incompatible integer to pointer conversion assigning to 'char *' from 'long' [-Wint-conversion] pt= pt - pp + 1; Main.c:28:13: warning: incompatible integer to pointer conversion returning 'long' from a function with result type 'char *' [-Wint-conversion] return pt - pp; Main.c:8:6: warning: unused variable 'txt_len' [-Wunused-variable] int txt_len = strlen(txt); /* txt の文字数 */ Main.c:9:6: warning: unused variable 'pat_len' [-Wunused-variable] int pat_len = strlen(pat); /* pat の文字数 */ Main.c:11:6: warning: unused variable 'i' [-Wunused-variable] int i; Main.c:6:8: warning: variable 'pt' is used uninitialized whenever function 'bf_match' is called [-Wsometimes-uninitialized] char *pt; /* txt をなぞるカーソル */ Main.c:15:9: note: uninitialized use occurs here while(*pt != '\0' && *pp != '\0'){ Main.c:6:10: note: initialize the variable 'pt' to silence this warning char *pt; /* txt をなぞるカーソル */ Main.c:49:58: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat] printf("%d 文字目に見つかりました。\n", s+1);

該当のソースコード

C言語

#include <stdio.h> #include <string.h> char *bf_match(char *pat , char *txt){ char *pt; /* txt をなぞるカーソル */ char *pp; /* pat をなぞるカーソル */ int txt_len = strlen(txt); /* txt の文字数 */ int pat_len = strlen(pat); /* pat の文字数 */ pt = txt; pp = pat; while(*pt != '\0' && *pp != '\0'){ if(*pt == *pp){ pt++; pp++; }else{ pt= pt - pp + 1; pp = 0; } } if(*pp == '\0'){ return pt - pp; } return NULL; } int main(void){ char *s; char s1[80]; /* テキスト */ char s2[80]; /* パターン */ printf("テキスト:"); scanf("%s", s1); printf("パターン:"); scanf("%s", s2); s = bf_match(s2, s1); if (s == NULL) puts("テキスト中にパターンは存在しません。"); else printf("%d 文字目に見つかりました。\n", s+1); return 0; }

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

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

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

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

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

guest

回答3

0

ポインタと int を使い分けましょう。

c

1#include <stdio.h> 2 3int bf_match(char *pat, char *txt) // ★ char * -> int 4{ 5 char *pt = txt; /* txt をなぞるポインタ */ 6 char *pp = pat; /* pat をなぞるポインタ */ 7 8 while (*pt != '\0' && *pp != '\0') { 9 if (*pt == *pp) { 10 pt++; 11 pp++; 12 } else { 13 pt -= pp - pat - 1; // ★★ 14 pp = pat; // ★ 15 } 16 } 17 if (*pp == '\0') 18 return pt - (pp - pat) - txt; // ★ 19 return -1; // ★ 20} 21 22int main(void) 23{ 24 char s1[80]; /* テキスト */ 25 char s2[80]; /* パターン */ 26 printf("テキスト:"); 27 scanf("%s", s1); 28 printf("パターン:"); 29 scanf("%s", s2); 30 int s = bf_match(s2, s1); // ★ int s 31 if (s < 0) // ★ 32 puts("テキスト中にパターンは存在しません。"); 33 else 34 printf("%d 文字目に見つかりました。\n", s + 1); 35 return 0; 36}

インデント(字下げ)をちゃんとしましょう。

追記
すみません。★★の行が間違っていたので修正しました。

投稿2021/05/03 01:35

編集2021/05/03 19:58
kazuma-s

総合スコア8224

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

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

0

google翻訳
Main.c:22:12: warning: 'long'から 'char *'に割り当てる互換性のない整数からポインタへの変換 [-Wint-conversion]
Main.c:8:6: warning: 未使用の変数 'txt_len' [-Wunused-variable]
Main.c:49:58: warning: formatはタイプ 'int'を指定しますが、引数のタイプは 'char *'です[-Wformat]

投稿2021/05/02 13:26

y_waiwai

総合スコア87719

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

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

0

bf_match() が「一致するのは何文字目か」を返したいなら、戻り値の型が char* なのはヘン。

投稿2021/05/02 13:20

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問