タグ付けされた質問 「c-strings」

17
「char s []」ではなく、文字列リテラルで初期化された「char * s」に書き込むときに、セグメンテーション違反が発生するのはなぜですか?
次のコードは、2行目でsegフォルトを受け取ります。 char *str = "string"; str[0] = 'z'; // could be also written as *str = 'z' printf("%s\n", str); これは完璧に機能しますが、 char str[] = "string"; str[0] = 'z'; printf("%s\n", str); MSVCおよびGCCでテスト済み。

9
'\ 0'とCのprintf()
Cの入門コースで、文字列を格納するときに、文字列\0の最後にnull文字が格納されることを学びました。しかし、文字列を印刷したい場合printf("hello")は\0、次のステートメントで終わっていないことがわかりましたが、 printf("%d", printf("hello")); Output: 5 しかし、これは一貫性がないようです。文字列のような変数がメインメモリに格納されることを知っている限り、何かを印刷しているときにメインメモリにも格納される可能性があると思いますが、なぜ違いがあるのでしょうか。
21 c  printf  stdout  c-strings 


4
文字配列を文字列として使用するにはどうすればよいですか?
Cの文字列は単なる文字配列であることを理解しています。そこで、次のコードを試しましたが、ガベージ出力やプログラムのクラッシュなど、奇妙な結果が得られました。 #include <stdio.h> int main (void) { char str [5] = "hello"; puts(str); } なぜこれが機能しないのですか? できれいにコンパイルされますgcc -std=c17 -pedantic-errors -Wall -Wextra。 注:この投稿は、文字列を宣言するときにNULターミネーター用のスペースを割り当てられなかったことから生じる問題の標準的なFAQとして使用することを目的としています。

1
std :: stringとCスタイルの文字列リテラルの比較
次のコードがあるとします。 #include <iostream> #include <string> #include <iomanip> using namespace std; // or std:: int main() { string s1{ "Apple" }; cout << boolalpha; cout << (s1 == "Apple") << endl; //true } 私の質問は次のとおりです。システムはどのようにこれら2つをチェックしますか?s1はオブジェクト"Apple"ですが、Cスタイルの文字列リテラルです。 私の知る限り、異なるデータ型を比較す​​ることはできません。ここで何が欠けていますか?

2
多次元配列の空の文字列リテラルがnullポインターに減衰するのはなぜですか?
いくつかの文字列リテラルで初期化された多次元C文字列配列を定義したいと思います。ではC Iは、次の操作を行います: #include <stdio.h> const char *strArr[2][1] = { {"foo"}, {""}}; int main(void) { printf("%p\t%p\n", strArr[0][0], strArr[1][0]); return 0; } gcc -std=c18 -pedantic test.c結果をコンパイルして実行すると、次のようになります。 $ ./a.out 0x55d95410f004 0x55d95410f008 予想どおり、空の文字列リテラルはstrArr[1][0]有効なポインタに減衰します。 しかし、私は同じコードを試してみてくださいC ++: #include <cstdio> const char *strArr[2][1] = { {"foo"}, {""}}; int main(void) { printf("%p\t%p\n", strArr[0][0], strArr[1][0]); return 0; } g++ …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.