2016-11-25 3 views
0

Hallo zu verkohlen habe ich versucht, einen Code zu Setup wieprintf mit Argumenten Funktionen einen Zeiger zurückkehr

#include <stdio.h> 

struct _data; 
typedef struct _data data; 
typedef struct _data { 
    double x; 
    double y; 
} data; 

const char* data_tostring(data* a) { 
    static char buffer[255]; 
    sprintf(buffer, "%f %f", a->x, a->y); 
    return buffer; 
} 

int main(){ 
    data a; 
    data b; 
    a.x = 0; 
    a.y = 0; 
    b.x = 1; 
    b.y = 1; 
    printf("%s %s \n", data_tostring(&a), data_tostring(&b)); 
    return 0; 
} 

mir die Ausgabe von 0 erwarteten 0 1 1, aber ich habe tatsächlich 0 0 0 0 Habe ich eine machen Fehler mit dem Schlüsselwort static und dem Rückgabewert in data_tostring()?

Danke für die Hilfe.

Antwort

5

Da bufferstatic ist, werden beide Aufrufe von data_tostring(...) in denselben Puffer geschrieben. Darüber hinaus ist die Reihenfolge der Auswertung von Funktionsparametern nicht spezifiziert, es gibt also keine Garantie, dass data_tostring(&a) vor data_tostring(&b) ausgewertet wird.

Eine Möglichkeit, dies zu fixieren ist von buffer als Argument an data_tostring vorbei:

void data_tostring(char* buffer, data* a) { 
    sprintf(buffer, "%f %f", a->x, a->y); 
} 

Und dann mehrere Puffer in main verwenden:

int main() 
{ 
    data a; 
    data b; 
    char a_buf[255]; 
    char b_buf[255]; 

    a.x = 0; 
    a.y = 0; 
    b.x = 1; 
    b.y = 1; 

    // Fill buffers 
    data_tostring(a_buf, &a); 
    data_tostring(b_buf, &b); 

    printf("%s %s \n", a_buf, b_buf); 
    return 0; 
} 

wandbox example


Wenn du wirklich willst se die static buffer, können Sie printf zweimal anrufen:

int main() 
{ 
    data a; 
    data b; 
    a.x = 0; 
    a.y = 0; 
    b.x = 1; 
    b.y = 1; 
    printf("%s", data_tostring(&a)); 
    printf(" %s \n", data_tostring(&b)); 
    return 0; 
} 

wandbox example

+0

Leider ist Ihre Lösung genau das, was ich vermeiden möchte :) – Fabio

+0

@Fabio: warum? Wenn Sie den gleichen Puffer verwenden möchten, benötigen Sie zwei separate Aufrufe von 'printf'. –

+0

@Fabio: habe meine Antwort mit einer alternativen Lösung mit dem 'statischen Puffer' bearbeitet. –

1
  • Das Problem ist, weil in der Sprache C, die Argumente in einer Funktion von right to left ausgewertet werden.
  • Also wird zuerst data_tostring(&b) ausgewertet und der Zeiger zeigt auf das Puffer-Char-Array.
  • Als nächstes wird die data_tostring(&a) ausgewertet und diesmal werden die vorhandenen char-Werte bereits durch sprintf(buffer, "%f %f", a->x, a->y); überschrieben.
  • Also, nach den zwei Argumente Bewertungen, zeigen die beiden Funktionen Auswertungen auf Puffer Char-Array, die die Werte von struct a hat. Das ist der Grund, warum Sie bekam 0 0 0 0.

Alternative Lösung:

Verwenden Sie zwei printf (Aussagen) und die Saiten einzeln drucken oder zwei Zeichen Puffer für jeden der structs verwenden (nicht empfohlen) .

Referenz: Compilers and argument order of evaluation in C++

Hoffnung, das hilft.

Verwandte Themen