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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

841閲覧

C言語 初心者 AOJ バッファオーバーフロー

nnyaaaaaaa

総合スコア1

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/04/17 02:52

編集2021/04/17 03:47

前提・実現したいこと

aizu online judgeで
https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/8/ITP1_8_D
を解きたいです。

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

インプットが五文字くらいだと大丈夫なのですが、
aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhhiiiiiiiiiijjjjjjjjjj (百文字)
x
をインプットするとバッファオーバーフローが起きてしまいます。

該当のソースコード

c

1#include <stdio.h> 2#include <string.h> 3 4int main() { 5 char a[1000], b[1000], c; 6 scanf("%s%c%s", a, &c, b); 7 strcat(a, a); 8 if (strstr(a, b) == NULL) printf("No\n"); 9 else printf("Yes\n"); 10 return 0; 11}

試したこと

最初は配列の要素数を101にしていて、strcatで二倍になるのが原因かなと思って要素数を1000にふやしたのですがだめなのでstrcatやstrstrで問題が起きているのかなとも思うのですがわかりません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

thkana

2021/04/17 03:01

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13241858103 https://teratail.com/help#posted-otherservice を参照して、 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」の処置をしてください。 マルチポストするってのは「ココにいる人達を信用してない」という表明みたいなモンだと思いますけれどね。
dodox86

2021/04/17 03:12

私のコメントですが: > つまり質問者さん自身の意図が不明です。 ああ、"%c"で1行目と2行目の改行を読み飛ばしたいと言う意図ですね。で、1行目のデータを繋げて、1周を越える文字列も検索できるようにする、という。
nnyaaaaaaa

2021/04/17 03:15

昔知恵袋をつかったことことがあって何も考えずそっちに投稿した後回答してもらえないかもしれないと思いプログラミング専門のサイトをさがしました。知恵袋のほうは消しておきます。説明など読んでおらず、マナーも守れずすいませんでした。
nnyaaaaaaa

2021/04/17 03:19

はい、%sだと空白、改行区切りで読み込むと書いてあったので%cはいらなかったですかね、すいません。
nnyaaaaaaa

2021/04/17 03:47

ありがとうございます。直します。
guest

回答1

0

ベストアンサー

関数strcatはC言語の標準関数であり、POSIXと言う規格で動作内容が規定されています。
例えば以下はLinuxのmanページ(3)での記載ですが、
Man page of STRCAT - Linux man(3)

この説明文中、

strcat() 関数は、dest 文字列の後に src 文字列を付け加える。 その際に、dest の最後にある終端のヌルバイト ('\0') は上書きされ、新たに生成された文字列の末尾に終端のヌルバイトが付与される。 二つの文字列 src と dest は重なってはならない。

とあります。「二つの文字列 src と dest は重なってはならない。」です。ご提示のコードはsrcとdestは同じものになっており、思いっきり重なっています。上記Linux manページの説明文中にはstrcatではなく、もう少し安全なstrncatの簡単な実装例が示されていますが、srcの末端の'\0'が見つかるまでコピーし続ける、ということは、srcからdestへ1文字ずつコピーしているそばからsrcの文字列が伸びてしまうので、ずっとコピーし続け、すなわちバッファオーバーフローになります。いったん別のバッファへコピーしてから操作しましょう。

投稿2021/04/17 03:53

編集2021/04/17 03:55
dodox86

総合スコア9183

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

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

nnyaaaaaaa

2021/04/17 04:02

ありがとうございます!これからは自分で関数の仕様を調べてみます。お手数おかけしました。
dodox86

2021/04/17 04:02

たまたま今回はバッファオーバーフローが発生したケースですが、strcatにおいてsrcとdestが重なっている場合の動作は規格上は「未定義」の動作です。何が起きても不思議ではありません。 https://pubs.opengroup.org/onlinepubs/009695399/functions/strcat.html > If copying takes place between objects that overlap, the behavior is undefined. 尚、「POSIX」よりは「ISO C」の規格として見た方が良いですね。
nnyaaaaaaa

2021/04/17 04:09

ライブラリの関数を使うときは定義に気をつけないといけないんですね。いろいろとありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問