2016-06-06 11 views
0

Ich erstelle eine Zeitklasse (String-Basis) für mein Schulprojekt! Ich bekomme ein Zeiger-Zeichen für die Zeit! Ich habe eine Funktion, um die Zeit zu normalisieren, wenn es seltsam ist.
in normalize-Funktion Ich habe ein Zeichen-Array, um die richtige Zeit zu speichern, aber wenn ich das Zeichen-Array dem Zeiger-Zeichen zuweisen möchte, wird es falsch gehen!Weisen Sie den Wert eines Zeichenarrays im Zeigerzeichen zu C++

char st[10] = "", sh[3] = "", sm[3] = "", ss[3] = ""; 
itoa(hour, sh, 10); 
itoa(minute, sm, 10); 
itoa(second, ss, 10); 

if(hour<10){strcat(st, "0");} 
strcat(st, sh);strcat(st, ":"); 
if(minute<10){strcat(st, "0");} 
strcat(st, sm);strcat(st, ":"); 
if(second<10){strcat(st, "0");} 
strcat(st, ss);strcat(st, ""); 

stime = st; 

stime ist Zeiger-Zeichen, die die Zeit in der Klasse speichern.
wenn ich Wert von stime verwenden möchte, bekomme ich sehr seltsame Ergebnisse. stimme den Wert der letzten Klasse stime. Zum Beispiel habe ich diesen Code:

time a("1:50:0"), b("4:5:10"); 
a.print(); 
b.print(); 

aber ich bekomme 04:05:10 für zwei Klassen, und ich weiß nicht, warum!
Wenn Sie den Rest des Codes muss ich es hier hochladen: Google Drive link to file

+2

Verwenden Sie 'std :: string' bitte beim Programmieren in C++. Das lässt meine Augen bluten. –

+0

Ich müsste die Klassendeklaration sehen, um sicher zu sein, aber ich würde annehmen, dass die Art, wie Sie stime zuweisen, dazu führt, dass alle auf den gleichen Speicherort zeigen und nur die zuletzt zugewiesenen Stime. – Russ

+0

@Russ Ich habe Dateilink in Post hinzugefügt! – amirsa00

Antwort

1

Wenn ich kompilieren Sie Ihren Code Ich erhalte die folgende Warnung:

warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 
    time(char *t = "0:0:0"):stime(t){normalize(-1, -1, -1);} 

Dies verursacht Ihr Problem.

"0:0:0" in C++ ist eine const char[5], die implizit in einen const char * umgewandelt werden können, aber nicht auf eine einfache char *, die die Speichertyp ist für Sie time gewählt haben.

Wie andere erwähnt haben, sollten Sie in C++ std::string statt char* verwenden.

Als allgemeine Regel sollten Sie Warnungen nie ignorieren, es sei denn Sie sind sicher, dass Sie wissen, warum sie erscheinen. Wie in diesem Fall sagen sie Ihnen oft, dass sich Ihr Code nicht so verhält, wie Sie es erwarten würden.

+0

Ich denke, Sie könnten Ihre vorherige Antwort behalten (oder hier hinzufügen), weil die Frage als * C++ * markiert ist im Wesentlichen versucht, es in C zu lösen, so ist Ihre ursprüngliche Lösung dennoch hier relevant. –

+0

Der Grund, warum ich es entfernt habe, ist, weil ich erkannte, dass es nicht die eigentliche Frage beantwortet, "warum diese beiden Aufrufe die gleiche Sache drucken" und selbst nach der Anwendung meiner Änderung hätte OP dasselbe Problem. Ihre Antwort befürwortet die Verwendung von 'std :: string' und würde das zugrunde liegende Problem beheben. – sokkyoku

+1

@sokkyoku, ich denke du liegst falsch. C++ - String-Literale haben den Typ const char [] '. Das Problem ist, dass der 'time' Konstruktor' char * ', nicht' const char * 'will. (Aber ja, mit std :: strings ist absolut der richtige Ansatz!) – Roddy

1

Sie können versuchen, diese als C++ Lösung:

#include <sstream> 
#include <iomanip> 
#include <iostream> 

using namespace std; 

string GetComponent(int value) 
{ 
    ostringstream oss; 
    oss << setfill('0') << setw(2) << value; 
    return oss.str(); 
} 

void PrintTime(int hh,int mm,int ss) 
{ 
    cout << GetComponent(hh) << ':' << GetComponent(mm) << ':' << GetComponent(ss) << endl; 
} 

Anwendungsbeispiel:

PrintTime(1,2,3); 
PrintTime(1,2,33); 
PrintTime(1,22,33); 
PrintTime(11,22,33); 
+0

Aber ich möchte die Zeit in einer Variablen speichern, wenn der Klassenkonstruktor aufgerufen und ich konnte Stunde, Minute und Sekunde in dieser oder anderen Arbeiten wie diese extrahieren. – amirsa00

+0

@ amirsa00: Ich sehe keine Klassen oder Konstruktoren in Ihrem Code, nur ein C-Stil versuchen, die Zeit zu drucken. Ich schlage vor, dass Sie sich zuerst entscheiden, auf welche Sprache genau Sie sich konzentrieren, dann geben Sie das relevante Stück Code an, das Sie zur Hand haben, und stellen Sie Fragen, die sich direkt auf dieses Stück Code beziehen. –

+0

@barakmanos gibt es tatsächlich eine Klasse in der gehosteten Google Drive-Datei, die am Ende der Frage verknüpft ist.Ich stimme jedoch zu, dass dies plump C-style-Code ist, was darauf hindeutet, dass OP ein C++ Anfänger ist – sokkyoku

Verwandte Themen