次のCプログラムで%c
および%s
の使用法と混同されました
#include<stdio.h>
void main()
{
char name[]="siva";
printf("%s\n",name);
printf("%c\n",*name);
}
出力は
siva
s
ポインターを使用して文字%cを表示する必要があり、文字列にはポインターが不要な理由
使用するとエラーが発生します
printf("%c\n", name);
私が得たエラーは
str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
これを試してみると:
#include<stdio.h>
void main()
{
char name[]="siva";
printf("name = %p\n", name);
printf("&name[0] = %p\n", &name[0]);
printf("name printed as %%s is %s\n",name);
printf("*name = %c\n",*name);
printf("name[0] = %c\n", name[0]);
}
出力は次のとおりです。
name = 0xbff5391b
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s
したがって、「名前」は実際にはメモリ内の文字の配列へのポインタです。 0xbff5391bで最初の4バイトを読み取ろうとすると、「s」、「i」、「v」、および「a」が表示されます。
Location Data
========= ======
0xbff5391b 0x73 's' ---> name[0]
0xbff5391c 0x69 'i' ---> name[1]
0xbff5391d 0x76 'v' ---> name[2]
0xbff5391e 0x61 'a' ---> name[3]
0xbff5391f 0x00 '\0' ---> This is the NULL termination of the string
文字を印刷するには、文字の値をprintfに渡す必要があります。値は、name [0]または* nameとして参照できます(配列名=&name [0]のため)。
文字列を出力するには、文字列へのポインタをprintfに渡す必要があります(この場合は 'name'または '&name [0]')。
%c
単一文字のcharのために設計されているため、1つの要素のみを出力します。char配列をポインタとして渡すと、配列の最初の要素(単一のchar)のアドレスを渡して出力されます。
s
printf("%c\n",*name++);
印刷します
i
等々 ...
ポインターは、文字列を直接操作できるため、%sには必要ありません。
参照解除演算子*とポインター型注釈*を混同しています。基本的に、C *では、場所によって異なることを意味します。
配列の名前はその最初の要素のアドレスなので、name
isは文字列「siva」を含むメモリへのポインタです。
また、文字を表示するためのポインターは必要ありません。この場合、配列から直接使用することを選択しています。代わりにこれを行うことができます:
char c = *name;
printf("%c\n", c);
単一の文字を表示する場合は、ポインターを使用する代わりにname[0]
を使用することもできます。
それはあなたの目的に役立ちますが、%c
を使用して完全な文字列を表示したい場合、これを試すことができます:
#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}