2 Stimmen

Bitte erklären Sie diese seltsame Ausgabe

#include<stdio.h>
#include<conio.h>

void print(char *arr);

void main()
{
    clrscr();

    char temp='r';
    print(&temp);
    getch();
}

void print(char *arr)
{
    int arrsz=sizeof(arr);
    printf("size is %d",sizeof(arr));
    printf("char is %c",arr);
}

Warum erhalte ich diese Ausgabe?

size is 1
char is e

Sicherlich sollte es heißen char is r ?

13voto

shodanex Punkte 14453

Sie drucken die Adresse, nicht den Wert.

printf("char is %c",*arr);

Versuchen Sie, dies durch einen Debugger laufen zu lassen, um zu verstehen, was passiert, und stellen Sie bitte eine echte Frage, z. B. was Ihrer Meinung nach passieren sollte, und was Sie stattdessen beobachten. Auf diese Weise werden Sie wahrscheinlich die meisten Ihrer Fragen selbst beantworten können.

Übrigens, einmal in print, arr ist eine lokale Variable, und sizeof als keine Möglichkeit, die Größe des ursprünglichen Arrays zu kennen, so sollte es drucken Größe ist 4. Der Code unten zeigt dieses Verhalten, und ein Unterschied zwischen Array und Zeiger, wenn es um sizeof kommt. Wenn Sie versuchen

EDIT: Dank Daniels Kommentar habe ich den Code in etwas geändert, das ich tatsächlich getestet habe, anstatt nur zu raten.

#include <stdio.h>

void print(char *);

int main(int argc, char ** argv)
{
    char temp = 'r';
    char temp2[] = {'a','b'};
    char temp3[] = {'r'};

    print(&temp);
    print(temp2);
    print(temp3);

    printf("sizeof temp is %d\n",sizeof(&temp));
    printf("sizeof temp2 is %d\n", sizeof(temp2));
    printf("sizeof temp3 is %d\n",sizeof(temp3));
    return 0;
}

void print(char * arr)
{
    printf("size of arr is %d\n", sizeof(arr));
    printf("arr contains %c\n", *arr);   
}

Sie erhalten :

size of arr is 4
arr contains r
size of arr is 4
arr contains a
size of arr is 4
arr contains r
sizeof temp is 4
sizeof temp2 is 2
sizeof temp3 is 1

2voto

samoz Punkte 54011

Du hast size gleich 1, weil sizeof(arr) die Größe dessen zurückgibt, worauf arr zeigt, ein Zeichen, das die Größe 1 hat.

Sie erhalten 'e', weil printf ein char* statt eines char erhalten hat, als das %c-Flag angegeben wurde. Ändern Sie es in printf("Char ist: %c", *arr).

Wenn Sie ein char* verwenden wollen, müssen Sie das %s-Flag in printf verwenden. Achten Sie aber auch darauf, dass Sie die Übergabe von printf mit Null abschließen, sonst erhalten Sie Müll.

2voto

John Kugelman Punkte 327535

Hm, irgendetwas ist hier falsch. Ich glaube nicht, dass diese Ausgabe.

  • arr es un char * y sizeof(char *) != 1 .
  • Es gibt keine '\n' s in Ihrem printf s.

Wenn Sie Ihren Code von Hand eingegeben haben, tun Sie das bitte nicht. Kopieren und Einfügen ist viel besser, damit wir sicher sein können, dass Sie keine Tippfehler gemacht haben. So wie Sie es geschrieben haben, sollten Sie etwas erhalten haben wie

size is 4char is 0

(Der "char is"-Teil könnte jedes beliebige Zeichen ausgeben.)

1voto

Eric Petroelje Punkte 58501

Sie versuchen, dies sowohl als Zeichenkette als auch als Zeichen zu verwenden (und Ihre Zeichenkette ist nicht nullterminiert). Um es als Zeichenfolge zu verwenden, würden Sie den Code wie folgt ändern:

//char temp='r';
char* temp = "r";

...

//printf("char is %c",arr);
printf("char is %s",arr);

Um es als Zeichen zu verwenden, würden Sie Ihre Druckanweisung wie folgt ändern:

printf("char is %c", arr[0]);

0voto

Michael Klement Punkte 3306

Siehe hier für eine Erklärung der String-Verarbeitung in C: http://www.macdonald.egate.net/CompSci/hstrings.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X