Strings und Zeichen mit printf

Lesezeit: 4 Minuten

Benutzeravatar von Aspire
Streben

Ich war verwirrt mit der Verwendung von %c und %s im folgenden C-Programm:

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

Ausgabe:

siva
s

Warum wir einen Zeiger verwenden müssen, um ein Zeichen %c anzuzeigen, und warum ein Zeiger für einen String nicht benötigt wird

Ich erhalte eine Fehlermeldung, wenn ich laufe

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

Ich habe diesen Fehler:

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

Benutzeravatar von Komal Padia
Komal Padia

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 übergeben printf. Der Wert kann referenziert werden als name[0] oder *name (da für ein Array name = &name[0]).

Um einen String zu drucken, müssen Sie einen Zeiger auf den String übergeben printf (in diesem Fall name oder &name[0]).

  • Das ist eine schöne Erklärung.

    – Petros404

    1. Mai um 6:39 Uhr

%c

ist für ein einzelnes Zeichen, ein Zeichen, ausgelegt, sodass nur ein Element gedruckt wird. Wenn Sie das char-Array als Zeiger übergeben, übergeben Sie die Adresse des ersten Elements des Arrays (das ist ein einzelnes Zeichen) und werden dann gedruckt:

s

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

wird drucken

ich

usw …

Der Zeiger wird für %s nicht benötigt, da er direkt mit Zeichenketten arbeiten kann.

Sie verwechseln den Dereferenzierungsoperator * mit der Zeigertypannotation *. Grundsätzlich 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 (dh der Wert, auf den der Zeiger zeigt)
  • Als Infix-Operator bedeutet * natürlich „multiplizieren“.

  • * in Bezug auf einen Zeiger bedeutet immer dasselbe. Sie überdenken es nur (ein Zeichen von Intelligenz). sieh es dir so an, int *myintptr; bedeutet, dass die Adresse der Zeiger ist myintptr referenziert wird eine speichern intund die *myintptr = 5; bedeutet, dass die Adresse der Zeiger ist myintptr referenziert wird, sollte eine 5. enthalten * bedeutet immer “der Wert bei”.

    – Joe Pelletier

    30. Dezember 2016 um 8:17 Uhr

Benutzeravatar von trojanfoe
Trojaner

Der Name eines Arrays ist also die Adresse seines ersten Elements name ist ein Zeiger auf den Speicher, der die Zeichenkette “siva” enthält.

Außerdem brauchen Sie keinen Zeiger, um ein Zeichen anzuzeigen; Sie entscheiden sich in diesem Fall einfach dafür, es direkt aus dem Array zu verwenden. Sie könnten stattdessen Folgendes tun:

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

Chhavis Benutzeravatar
Chhavi

Wenn Sie ein einzelnes Zeichen anzeigen möchten, können Sie auch verwenden name[0] anstatt Zeiger zu verwenden.

Es wird Ihrem Zweck dienen, aber wenn Sie die vollständige Zeichenfolge mit anzeigen möchten %cdas kannst du versuchen:

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

gaetan vitracs Benutzeravatar
gaetan vitrac

Die Sache ist, dass die printf-Funktion einen Zeiger als Parameter benötigt. Ein Zeichen ist jedoch eine Variable, auf die Sie direkten Zugriff haben. Ein String ist ein Zeiger auf das erste Zeichen des Strings, daher müssen Sie das * nicht hinzufügen, da * der Bezeichner für den Zeiger einer Variablen ist.

Benutzeravatar von user438383
Benutzer438383

Oder Sie können verwenden %c wie im folgenden Code:

#include <stdio.h>

void main()
{
    char name[]="siva";
    //prints as string form
    printf("%s\n",name);
    
    //print each letter on different line
    int size= sizeof(name);
    int i;
    for(i=0;i<size;i++){
        printf("%c\n",name[i]);
    }
    
}

1415810cookie-checkStrings und Zeichen mit printf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy