Strings en karakter met printf

Ik was in de war met het gebruik van %cen %sin het volgende C-programma

#include <stdio.h>
void main()
{
    char name[]="siva";
    printf("%s\n",name);
    printf("%c\n",*name);
}

Uitvoer is

siva
s

Waarom we een aanwijzer moeten gebruiken om een teken %c weer te geven, en een aanwijzer is niet nodig voor een tekenreeks

Ik krijg een foutmelding wanneer ik gebruik

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

Fout die ik heb is

str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’

Antwoord 1, autoriteit 100%

Als je dit probeert:

#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]);
}

Uitvoer is:

name = 0xbff5391b  
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s

Dus ‘naam’ is eigenlijk een verwijzing naar de reeks tekens in het geheugen. Als u de eerste vier bytes probeert te lezen op 0xbff5391b, ziet u ‘s’, ‘i’, ‘v’ en ‘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

Om een ​​personage af te drukken, moet u de waarde van het teken met afdrukken doorgeven. De waarde kan worden verwezen als naam [0] of * naam (aangezien voor een arraynaam = & amp; naam [0]).

Om een ​​reeks af te drukken, moet u een aanwijzer doorgeven aan de tekenreeks naar PrintF (in dit geval ‘NAAM’ of ‘& AMP; NAAM [0]’).


Antwoord 2, Autoriteit 21%

%c

is ontworpen voor een enkel teken A Char, dus het print slechts één element. Raadpleeg de array van de aanwijzer als aanwijzer die u passeert het adres van het eerste element van de array (dat is een enkel char) en wordt vervolgens afgedrukt :

s

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

print

i

enzovoort …

Aanwijzer is niet nodig voor de% s omdat het rechtstreeks met reeks tekens kan werken.


Antwoord 3, Autoriteit 6%

U verwarren van de dereferentie-operator * met annotatie van het aanwijzertype *.
Kortom, in C * betekent verschillende dingen op verschillende plaatsen:

  • in een type, * betekent een aanwijzer. int is een integer-type, int * is een aanwijzer naar integer type
  • als prefix-operator, * betekent ‘Dereference’. Naam is een aanwijzer, * Naam is het resultaat van Derferencing IT (d.w.z. de waarde die de aanwijzer op)
  • krijgt

  • Natuurlijk, als een Infix-operator, * betekent ‘vermenigvuldig’.

Antwoord 4, Autoriteit 4%

De naam van een array is het adres van zijn eerste element, dus nameis een aanwijzer op het geheugen met de string “SIVA”.

Je hebt ook geen aanwijzer nodig om een teken weer te geven; u kiest er in dit geval gewoon voor om het rechtstreeks vanuit de array te gebruiken. Je zou in plaats daarvan dit kunnen doen:

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

Antwoord 5

Als u een enkel teken wilt weergeven, kunt u ook name[0]gebruiken in plaats van de aanwijzer.

Het zal je doel dienen, maar als je de volledige string wilt weergeven met %c, kun je dit proberen:

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

Antwoord 6

Het punt is dat de printf-functie een pointer als parameter nodig heeft. Een char is echter een variabele waar je direct toegang toe hebt. Een string is een pointer op het eerste char van de string, dus u hoeft de * niet toe te voegen omdat * de identifier is voor de pointer van een variabele.

Other episodes