[過去ログ]
Qiita 2 - キータぞ、来たぞ、キータだぞー (1002レス)
Qiita 2 - キータぞ、来たぞ、キータだぞー http://mevius.5ch.net/test/read.cgi/tech/1658762410/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
81: デフォルトの名無しさん [sage] 2022/09/18(日) 13:11:36.43 ID:Yf5HDNqR 『【C】初めてのC言語(17. 文字列リテラル)』の表題で > 文字列リテラルの機能 > ・ダブルクォーテーションで囲まれた文字列(文字列リテラル)は、 > 自動的に末尾に「\0」を付ける処理が入っています。 > ・ダブルクォーテーションを使わず、char型の配列として文字列を > 作る場合は終端文字として「\0」を入れます。 と書いてるのは文字列リテラルとcharの配列とcharの配列に文字列リテラル で初期化するのの区別がついていないんだろう。 > 文字列宣言でよくある誤り > 以下のように、「n文字を格納するために用意する配列の要素数がn(=nバイト)」 > だと、最後に「\0」を入れる要素が足りなくなってしまいます。 > #include <stdio.h> > > // よくある誤り > int main(void){ > const char str[5] = "Hello"; // 配列の要素数が「文字列の長さと等しい」と、終端文字を入れられない! > printf("%s\n", str); > return 0; > } char の配列の最後に'\0'を入れなきゃいけないルールもないのでこれも誤り。 http://mevius.5ch.net/test/read.cgi/tech/1658762410/81
82: デフォルトの名無しさん [sage] 2022/09/18(日) 13:15:00.45 ID:Yf5HDNqR > ・そのため以下の例では、memcpyによるコピー先(※ここではstr1)で > 確保されているメモリ領域を確認しておく必要があります。 > >#include <stdio.h> > > int main(void){ > char str1[] = "Hello"; > char str2[] = "Hello,world!"; > memcpy(str1, str2, 13); // 長い文字列で上書きはNG > return 0; > } ↑を見るとcharの配列の説明をしたいのかな? と思えてしまうな。 http://mevius.5ch.net/test/read.cgi/tech/1658762410/82
83: デフォルトの名無しさん [sage] 2022/09/18(日) 13:22:53.14 ID:Yf5HDNqR 同じ人の別の記事 『【C】初めてのC言語(19. 文字列とバッファオーバーフロー)』 https://qiita.com/nkojima/items/4d9cec9e686aee41eec2 > 終端文字とバッファオーバーフロー(オーバーラン) > 以下のように終端文字「\0」を上書きしてしまうと、printf関数は「\0」が > 現れるまで探し続けることになります。 > そのため、配列として確保していない領域(※100バイト目以降)にもアクセス > しようとして、バッファオーバーフローを引き起こしてしまう可能性があります。 > paiza.ioの環境ではバッファオーバーフローは発生しませんでしたが... > > #include <stdio.h> > int main(void){ > char str[100] = "Hello"; > str[5] = '!'; // 終端文字「\0」が失われてしまう! > > printf("%s\n", str); > return 0; > } 初期化子で明示的に初期化される要素以外の要素には 0 が格納されることを 理解していない。 http://mevius.5ch.net/test/read.cgi/tech/1658762410/83
86: デフォルトの名無しさん [sage] 2022/09/18(日) 13:44:08.06 ID:Yf5HDNqR 『【C】初めてのC言語(16. 文字列の基本)』 https://qiita.com/nkojima/items/d87ce0cb15dd1a26f21a > 文字列にまつわる業界ルール > ・「C言語の文字列に関する業界ルール」として、以下の2つのルールが > 挙げられていました。 > ・先頭要素から順に1文字ずつ文字コードを格納して文字列を表す。 > ・最後の文字の直後には「文字コード0の文字」を必ず格納し、それ以降の > メモリ空間は利用しない。 > > #include <stdio.h> > > int main(void){ > const char str1[10] = "Hello"; > const char str2[10] = "He\0llo"; > > printf("%s\n", str1); > printf("%s\n", str2); // 「\0」が終端文字(ヌル文字)として扱われている。 > > return 0; > } 文字列中に'\0'を含まない文字列リテラルなら > ・最後の文字の直後には「文字コード0の文字」を必ず格納し、それ以降の > メモリ空間は利用しない。 は正しいが、 > const char str1[10] = "Hello"; 要素数 10 ある char の配列は普通に str1[9] までアクセスは可能。 やはり文字列リテラルと char の配列で区別がついてない気がする。 http://mevius.5ch.net/test/read.cgi/tech/1658762410/86
91: デフォルトの名無しさん [] 2022/09/18(日) 18:29:18.38 ID:Yf5HDNqR >>87 > '\0'がないとprintf("%s\n", str) では文字列の終わりを見つけらない >>90 > 0を入れなきゃいけないルールはあるぞw > 文字列リテラルを使えば必ず入る > > 間違ってるのは記事主じゃなくお前だよw 本気で言ってるのか敢えて頭おかしいフリしてるのかどっちかな?? > #include <stdio.h> > > int main(void){ > const char str[5] = "Hello"; > printf("%.5s\n", str); > return 0; > } https://wandbox.org/permlink/ItLeFxoqffh2nIfb http://mevius.5ch.net/test/read.cgi/tech/1658762410/91
93: デフォルトの名無しさん [sage] 2022/09/18(日) 20:05:23.60 ID:Yf5HDNqR > > '\0'がないとprintf("%s\n", str) では文字列の終わりを見つけらない > > と書かれてるのに > printf("%s\n", str); → printf("%.5s\n", str); > と勝手に変えてるし説明もない '\0'で文字列の終端明示する必要はないし説明要る人は想定してないけど 説明要るの?? http://mevius.5ch.net/test/read.cgi/tech/1658762410/93
94: デフォルトの名無しさん [] 2022/09/18(日) 20:13:17.43 ID:Yf5HDNqR >>92 勝手に変えてる>>88の説明はあるのかな http://mevius.5ch.net/test/read.cgi/tech/1658762410/94
96: デフォルトの名無しさん [sage] 2022/09/18(日) 20:57:14.85 ID:Yf5HDNqR > >>81で引用されてるところは、 > > const char str[5] = "Hello"; とすると、最後に'\0'が入らないから > 入ってると思ってprintf("%s\n", str);を使うとうまくいかない > > という話だからprintf("%.5s\n", str);に変えてはどうしようもないんだが > ID:Yf5HDNqRには理解できないんだな 「char の配列の最後に'\0'を入れなきゃいけないルールもないのでこれも誤り。」 が読めないか理解できない人か。頭が悪いのは本人の責任じゃないし仕方ないな。 > printf("%s\n", str);で文字列の終わりを見つけられてるように見えることもあるけど > それは実装依存うまくいっているだけだから、printf("%s\n", str);で文字列の終わりを > 見つけられるということにはならないという例を挙げているわけだが ID:Yf5HDNqRには > 理解できないんだな 「と勝手に変えてるし説明もない」という話から、「変更には説明が必要」という 考えの人かな? と思って聞いたのだけど自分は例外なんですねw http://mevius.5ch.net/test/read.cgi/tech/1658762410/96
97: デフォルトの名無しさん [sage] 2022/09/18(日) 21:04:50.53 ID:Yf5HDNqR > const char str[5] = "Hello"; が正しいか正しくないかというとC言語的には正しい。 このオブジェクトについて文字列終端に'\0'があることを期待するのが間違いなだけ。 文字列リテラルの話ではないのでそう題するのも間違い。 http://mevius.5ch.net/test/read.cgi/tech/1658762410/97
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.028s