wake-up-neo.net

Zeichenketten und Zeichen mit printf

Ich wurde mit der Verwendung von %c und %s im folgenden C-Programm verwechselt

#include<stdio.h>

    void main()
    {
     char name[]="siva";
     printf("%s\n",name);
     printf("%c\n",*name);
    }

Ausgabe ist

siva
s

Warum wir einen Zeiger verwenden müssen, um ein Zeichen% c anzuzeigen, und ein Zeiger ist für einen String nicht erforderlich

Ich bekomme Fehler, wenn ich benutze

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

Fehler, den ich bekam ist

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

Wenn Sie dies versuchen:

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

Ausgabe ist:

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

'Name' ist also eigentlich ein Zeiger auf das Array von Zeichen im Speicher. Wenn Sie versuchen, die ersten vier Bytes bei 0xbff5391b zu lesen, sehen Sie 's', 'i', 'v' und '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

Um ein Zeichen zu drucken, müssen Sie den Wert des Zeichens an printf übergeben. Der Wert kann als name [0] oder * name referenziert werden (da für ein Array name = & name [0]).

Um eine Zeichenfolge zu drucken, müssen Sie einen Zeiger auf die Zeichenfolge an printf übergeben (in diesem Fall 'Name' oder '& Name [0]').

59
Komal Padia
%c

ist für ein einzelnes Zeichen a char konzipiert, so dass nur ein Element gedruckt wird. Wenn Sie das char-Array als Zeiger übergeben, übergeben Sie die Adresse des ersten Elements des Arrays (d. h. ein einzelnes char). Anschließend wird Folgendes gedruckt: 

s

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

wird drucken 

ich  

und so weiter ...

Für die% s wird kein Zeiger benötigt, da er direkt mit der Zeichenkette arbeiten kann.

10
aleroot

Sie verwechseln den Dereferenzierungsoperator * mit der Zeigertypanmerkung * . Im Wesentlichen bedeutet in C * an verschiedenen Stellen verschiedene Dinge:

  • In einem Typ bedeutet * einen Zeiger. int ist ein ganzzahliger Typ, int * ist ein Zeiger auf einen ganzzahligen Typ
  • Als Präfixoperator bedeutet * 'Dereferenzierung'. name ist ein Zeiger, * name ist das Ergebnis der Dereferenzierung (d. h. Abrufen des Werts, auf den der Zeiger zeigt).
  • Als Infix-Operator bedeutet * natürlich "Multiplizieren".
6
zeuxcg

Der Name eines Arrays ist die Adresse des ersten Elements. name ist ein Zeiger auf den Speicher, der die Zeichenfolge "siva" enthält.

Sie benötigen auch keinen Zeiger, um ein Zeichen anzuzeigen. In diesem Fall entscheiden Sie sich nur für die direkte Verwendung des Arrays. Sie können dies stattdessen tun:

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

Wenn Sie ein einzelnes Zeichen anzeigen möchten, können Sie anstelle des Zeigers auch name[0] verwenden.

Es wird Ihrem Zweck dienen, aber wenn Sie den vollständigen String mit %c anzeigen möchten, können Sie Folgendes versuchen:

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