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

Als u een teken wilt afdrukken, moet u de waarde van het teken doorgeven aan printf. Er kan naar de waarde worden verwezen als name[0] of *name (sinds voor een arraynaam = &name[0]).

Om een ​​string af te drukken, moet je een pointer doorgeven aan de string naar printf (in dit geval ‘name’ of ‘&name[0]’).


Antwoord 2, autoriteit 21%

%c

is ontworpen voor een enkel teken een char, dus het drukt slechts één element af. Als u de char-array als een aanwijzer doorgeeft, geeft u het adres door van het eerste element van de array (dat is een enkele char) en wordt vervolgens afgedrukt :

s

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

wordt afgedrukt

ik

en ga zo maar door …

Aanwijzer is niet nodig voor %s omdat deze direct kan werken met tekenreeks.


Antwoord 3, autoriteit 6%

Je verwart de dereferentie-operator * met de 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 pointer naar integer type
  • Als prefix-operator betekent * ‘dereferentie’. naam is een aanwijzer, *naam is het resultaat van de verwijzing ernaar (d.w.z. het verkrijgen van de waarde waarnaar de aanwijzer verwijst)
  • Als tussenvoegsel-operator betekent * natuurlijk ‘vermenigvuldigen’.

Antwoord 4, autoriteit 4%

De naam van een array is het adres van het eerste element, dus nameiseen verwijzing naar het geheugen dat de string “siva” bevat.

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