Cast char zu char-Arrays oder char-array char?
Also sagen wir mal ich habe einen char, und ich will strcat() in einen char-array in eine einzige Zeile code. Für [eine nicht-praktische] Beispiel:
strcat("ljsdflusdfg",getchar());
Bzw. wollte ich tun das Gegenteil, was wäre die entsprechende Funktion concat oder festgelegten Zeichenfolgen, unabhängig von Datentyp? Oder vielleicht gibt es eine syntax, die ich bin fehlt...
Hier ist ein Beispiel. Es stellt so gut, aber stürzt ab.
char* input(){
char* inp="";
while(1){
char c=getchar();
if(c){
if(c=='\n'||c==EOF){
break;
}else{
strcat(inp,(char*)c);
}
}
}
return inp;
}
InformationsquelleAutor | 2011-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
strcat
behandelt das argument als ein Zeiger auf eine null-terminierte Zeichenfolge. Casting einechar
zu einemchar *
ist einfach gefährlich, und ich kann mir keinen Grund, es wäre schon mal hilfreich (nicht zu unterstellen, dass Sie dumm sind es zu versuchen - jeder macht dumme Fehler, wenn Sie lernen. Das ist, warum wir hier sind.)Der Grund ist, dass es interpretieren würde die single-byte -
char
, plus die zusätzlichensizeof(char*) - sizeof(char)
(Regel 3) bytes Umgebung, diechar
, als einen Zeiger, der auf das um... überall. Sie haben keine Möglichkeit zu wissen, wo es Punkte, da 3 dieser bytes sind außerhalb Ihrer Kontrolle, und somit keine Möglichkeit zu wissen, ob es Punkte auf gültige Daten.Dass Sie vielleicht nehmen Sie dies als einen zweiten Ansatz:
Dieser Zeit, Sie würden besser sein, da
&c
ist ein Ausdruck vom Typchar *
und keine casts notwendig sind. Aber wiederstrcat
davon ausgegangen, dass es argument ist einen nul-terminierten string, und da Sie keine Möglichkeit haben, garantiert ein nul-byte nach Ihremchar
Daten, die dies nicht tun.Der beste Weg ist dieser:
UPDATE:
Eigentlich habe ich gelogen. Die besten Möglichkeit ist die Verwendung der standard-Bibliothek-Funktion
fgets
, das scheint zu tun, mehr oder weniger, was Sie zu tun versuchen. Wahrhaftig, ich vergaß es, aber wenn dies ist eine Hausaufgabe Ihr professor kann nicht wollen, dass Sie mitfgets
so dass Sie lernen können, wie man es manuell zu tun. Allerdings, wenn dies nicht Hausaufgaben,fgets
macht genau das, was du bist suchen für. (Eigentlich der Dritte Ansatz ist wohl auf dem Weg zu reimplementingfgets
oderfgets
-ähnliche Funktionalität.)Ich würde auch hinzufügen, einige andere Kommentar auf Ihrem
input
Funktion:char* inp = "";
auf nur-lese-Daten. Ein Fehler in der C-standard (für rückwärts-Kompatibilität) erlaubt eine string-Literale zugeordnet werdenchar*
Arten stattconst char *
Arten wie es (IMHO) sein sollte.Es gibt mehrere Möglichkeiten, dies zu nähern, aber das beste ist die dynamische Zuordnung. Verwenden Sie die
malloc
Funktion zu behalten einige der Daten, verfolgen Sie, wie viel Sie verwendet haben, in Ihrer Funktion, und verwenden Sie dierealloc
Funktion, wenn Sie am Ende brauchen mehr Raum, um es zu speichern. Wenn Sie dabei Hilfe benötigen, ich bin sicher, du wirst wieder hier sein (hoffentlich nicht zu bald) mit einer anderen Frage. 🙂getchar()
gibt einint
, weilEOF
definiert werden, die außerhalb der normalen Bandbreite eineschar
. Um zu unterscheiden zwischenchar
undEOF
, ist es am besten zu machenc
eineint
. Ansonsten ein absolut gültigen Charakter kann das signalEOF
. Werden Sie sicher, dass castc
unten, um einechar
wenn Sie es hinzufügen, um die Zeichenkette, obwohl.Die andere Lösung ist das Lösung. Die
&c
version ist falsch, aus dem gleichen Grund(char *)c
ist. Wenn Sie denken, dass die andere version ist zu viel code, willkommen auf C-Programmierung. 😛 (Tatsächlich, es gibt einen vierten Weg, aber ich bin mir nicht sicher, ob oder nicht, das ist Hausaufgaben, und ich will nicht riskieren Sie Ihre Hausaufgaben für Sie, so bin ich irrenden auf der Seite der Vorsicht.)Dies ist nicht Hausaufgaben. Ich versuche zu verstehen C für mein eigenes wohl, aber ich habe gerade nicht so viel Zeit auf meinen Händen, und ich finde den Prozess unerträglich. Was ist der vierte Weg?
Ich bearbeitet meine Antwort. (Und keine Sorge - ich ging durch den gleichen Prozess. Es wird keinen Sinn machen, für ein paar Monate, und dann eines Tages wirst du es bekommen, und es wird alles bergab von dort.)
Vielen Dank für den Zeiger - ich werde sehen, was in der Funktion fgets. Ich wusste nicht, mein input-Funktion wurde so schlecht. Zu Ihrem Punkt 1 - ich bin nicht besorgt, mit buffer-overflows, und ich weiß nicht, wie zu erklären, was in anderen Sprachen genannt werden könnte ein "string fester Länge", und ich will nicht, um zu lernen, malloc, es sei denn, es ist die Zeichenfolge fester Länge-Erklärung-Funktion ich bin auf der Suche nach. Zu Punkt 2 - ich dachte, getchar gibt einen char-Datentyp, der ein byte.
InformationsquelleAutor Chris Lutz
Versucht, die concat-Funktion den Inhalt des Speichers an, wo immer 'c' (als Speicher) ist, bis er eine null.
Ist es besser, erstellen Sie einen leeren string, was die maximale Größe, die Sie denken, ist angemessen, füllen Sie es mit Nullen und dann einfach einfügen 'c' in die aktuelle Letzte position
c
Punkte (wenn der Zauber bis zu einem Zeiger).&c
ist, woc
gespeichert ist. Aber +1 für den besseren Weg.Das ist es, was ich meinte, das ich versuchte zu vermeiden, die Zeiger Wort - aber Lesen Sie agian es hätte besser formuliert, danke.
Hätte ich nicht +1 gegeben die Sie bereits, ich würde es tun. Vermeiden das P-Wort ist wahrscheinlich eine gute Politik, wenn Sie anfangen mit C.
InformationsquelleAutor Martin Beckett
Wenn Sie möchten, verketten Sie eine einzelne
char
auf eine Zeichenfolge, die Sie verwenden könnenstrncat()
und geben Sie die Anzahl der Zeichen zum verketten, als1
. Aber beachten Sie, dass:char
Objekt die Adresse (also können Sie nicht direkt verketten, das Ergebnisgetchar()
.Beispiel:
In C99 können Sie eine compound literal und die zweite Einschränkung gilt nicht für:
InformationsquelleAutor caf
Dies wird nicht funktionieren, da die *inp char-Zeiger nicht irgendwelche Speicher sichern. Wenn Sie erklärt, es werden char *inp = ""; " Sie gab ihm nur die Adresse von einem leeren string. Wenn Sie hatte die folgende Deklaration char *inp = "abcdefg", dann könnten Sie geschrieben habe 7 chars, bevor Sie überschrieben haben, die '\0' und in Schwierigkeiten geriet.
Müssen Sie dynamisch erhöhen Sie die Größe der backing-Speicher, wie Sie input-mehr und mehr Zeichen. Sie haben auch das problem zu wissen, Wann man den Speicher frei, so dass Sie nicht bekommen, Speicherverluste.
Auch, Ihre strcat haben muss, '&' vor die c.
Wenn er gegeben hatte
char *inp = "abcdefg";
er konnte nicht geschrieben werden alle Daten sicher auf der Schnur - es ist in nur-lese-Speicher.Dies ist nicht wirklich wahr. Auf manchen Systemen ja, aber nicht Global.
Auch für Anonyme - char xyz[50]; memset((void *), xyz, 0, 50); oder was auch immer Länge Sie wollen. Wenn das array Global definiert, es ist eine Konvention, es werden alle gelöscht. Aber einige compiler-Optionen schreiben eine schlechte Muster in den Raum, so dass Sie überprüfen können, für unsachgemäßen Gebrauch.
InformationsquelleAutor No One in Particular
First off, sind Sie wieder ein Zeiger auf ein stack-array zugewiesen. Dies ist undefiniert bahavior. Zweitens, Sie versucht, zu schreiben chars auf nicht zugeordneten Speicher. Drittens, die Art der
inp
istconst char*
nichtchar*
.Du willst so etwas wie:
inp
gültig ist, obwohl, wenn Sie sagte, dass der Typ sollte werdenconst char*
würde ich nicht argumentieren überhaupt. 4. Ihre Funktion ist genauso gefährlich, wenn nicht mehr so, wie es kein bounds checking (eine viel schwerer, Fehler zu erkennen). Wenn Sie möchten, dass der Benutzer pass in Ihrem eigenen Puffer, machen Sie Sie gehen in Ihrer eigenen Länge als auch.char *inp = ""
sollte am Ende wird Speicher auf dem stack. mit Optimierungen Sie kann in der global-Speicher, vorausgesetzt globalen Speicher VORHANDEN ist, auf die Architektur, die er kompiliert. 2. inp+1 nicht explizit zugewiesen, indem die Funktion. 3. Der Typ sollteconst char *
. Der einzige Grund, warum er nicht immer ein Fehler ist, da er mit einem legacy-standard. 4. Während meine Funktion ist gefährlich, es ist nicht mehr so, alsstrcat
oder der rest derstring.h
.InformationsquelleAutor KitsuneYMG
Ihren code abstürzt, weil strcat erwartet, dass null-terminierte strings für die Parameter.
Wenn Sie verketten möchten ein char, müssen Sie zuerst erstellen Sie eine null-terminierte Zeichenfolge aus.
Aber nicht verwenden strcat, es sei denn, du kannst garantieren, dass der Eingabe-string zugewiesen hat Platz für das zusätzliche Zeichen. Besser, Sie "strncat", die auch beinhaltet einen parameter für die Menge an Speicherplatz in dem ersten parameter (dest).
Empfehle ich die Lektüre diese ersten.
InformationsquelleAutor sinelaw
Eine einfache Möglichkeit ist die Verwendung von snprintf:
Es ist eine einfache Lösung, aber erfordert, dass Sie in etwa weiß wie groß der string sein wird, vor der Zeit.
Hinweise: I verwenden Sie die +1-um mich daran zu erinnern, dass es muss Raum sein für die null-Terminierung, und snprintf ist besser als sprintf, wie es gegeben ist, die Größe des Puffers zu verhindern, Pufferüberlauf.
InformationsquelleAutor Daniel
Cast char zu char-array?
Es ist genauso wie zu sagen, die Sie möchten, werfen einen char in string.
Sie kann das einfach nicht, dass direkt ein.
Anstelle von char, statt es in ein array (myChar[]).
Afterwhich, strcat Sie es mit Ihrem original-char-array.
strcat
zu arbeiten.ich habe entfernen einer Erklärung meiner Antwort, um es zu korrigieren. Danke für die Erinnerung mich über die 0-Sache.
Ich habe nicht downvote (ich war kurz davor, aber dann haben Sie es behoben), aber während Sie haben es richtig, Sie noch nicht genau klar gemacht, oder hilfreich. Jemand, der weiß, C kann sagen, es ist richtig, aber jemand, der versteht nicht, warum Gießen eine
char
zu einemchar *
funktioniert nicht, wird nicht verstehen, warum Gießen einechar
zu einem string nicht funktioniert. Sie Art nur erklärte, eine Tautologie gibt.InformationsquelleAutor Neilvert Noval