そのようなタイプの構文をどのように書くことができますか
#include<stdio.h>
main()
{
char *str;
str="%s";
printf(str,"K\n");
return 0;
}
printf
声明は有効ですか?
はい、あなたstr
はタイプなので、それは有効ですchar *
。これはprintfのプロトタイプです:
int printf ( const char * format, ... );
呼び出された関数の観点から、ステートメントは次のようになります。
printf("%s","K\n");
タイプの定数式であり、"%s"
です。"K\n"
char *
への関数呼び出しprintf()
は有効です。これは、最初のパラメーターとして、書式指定子として機能する定数文字列を想定しているためです。文字列を引用符で囲んだものと考えないでください。文字の配列 (および終端の 0 文字) と考えてください。C(および意味のあるプログラミング言語)では、値がある限り、その型と実際の値/内容がその動作を決定します-それをリテラル、変数、またはその他の式にします(今のところ、constの正確性は考慮しません簡単にするために)。数学のように、書くかどうかは問題ではありません
3 + 2 = 5
また
x = 3
y = 2
x + y = 5
ここで、2 番目の等式の 3 行目は、x と y がリテラルではないにもかかわらず有効です。それらは変数であり、それらを操作するときに現在の値が使用されます。
ここで、他の回答に欠けている const の正確性に関する小さな点: 文字列リテラルは型const char *
でありchar *
、その内容を変更できないためではありません。だから書き方が悪いんだよ
char *foo = "blah blah";
代わりに書く
const char *foo = "blah blah";
はい、構文は有効です。このプログラムの結果は、文字列「K\n」です。
\nは改行を意味します。
%sは、印刷する最初の引数を文字列として出力する必要があることをprintfに通知します。
これを参照してください:http ://www.cplusplus.com/reference/clibrary/cstdio/printf/
これは非常に単純なプログラムです。この質問をするのにかかった時間に、プログラムを自分でコンパイルして実行し、答えを見ることができたはずです。あなたはすることによって最もよく学びます。
printf("%s","K\n");
- このステートメントは 2 つの文字列リテラル%s
ansk\n
です。これら 2 つの文字列リテラルは、読み取り専用データとしてテキスト セグメントに含まれます。ここで、 が文字列リテラルのアドレスであり1000
、 が文字列リテラルのアドレスであると考えてください。とが に渡される 2 つの引数になります。%s
2000
k\n
1000
2000
printf
printf("%s","K\n");
これは以下のようにも書けます
...
char *a = "%s"; //Address 1000 is stored in a
char *b = "k\n"; //Address 2000 is stored in b
printf(a,b); //Now we are passing 1000 and 2000 to printf
...
また、以下のメソッドでも文字列を出力できることをお伝えしたいと思います。
...
char *a = "hello world"
printf(a); //This will print hello world
...