Ik was in de war met het gebruik van %c
en %s
in 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 name
iseen 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.