web-dev-qa-db-ja.com

printfを使用した文字列と文字

次の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 *’
39
Aspire

これを試してみると:

#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]')。

66
Komal Padia
%c

単一文字のcharのために設計されているため、1つの要素のみを出力します。char配列をポインタとして渡すと、配列の最初の要素(単一のchar)のアドレスを渡して出力されます。

s

printf("%c\n",*name++);

印刷します

i

等々 ...

ポインターは、文字列を直接操作できるため、%sには必要ありません。

10
aleroot

参照解除演算子*とポインター型注釈*を混同しています。基本的に、C *では、場所によって異なることを意味します。

  • 型では、*はポインターを意味します。 intは整数型、int *は整数型へのポインタです
  • プレフィックス演算子として、*は「参照解除」を意味します。 nameはポインター、* nameはそれを逆参照した結果です(つまり、ポインターが指す値を取得します)
  • もちろん、中置演算子として、*は「乗算」を意味します。
6
zeuxcg

配列の名前はその最初の要素のアドレスなので、nameisは文字列「siva」を含むメモリへのポインタです。

また、文字を表示するためのポインターは必要ありません。この場合、配列から直接使用することを選択しています。代わりにこれを行うことができます:

char c = *name;
printf("%c\n", c);
4
trojanfoe

単一の文字を表示する場合は、ポインターを使用する代わりにname[0]を使用することもできます。

それはあなたの目的に役立ちますが、%cを使用して完全な文字列を表示したい場合、これを試すことができます:

#include<stdio.h>
void main()
{ 
    char name[]="siva";
    int i;
    for(i=0;i<4;i++)
    {
        printf("%c",*(name+i));
    }
} 
0
Chhavi