Wie verkettet man String und Int in C?

Lesezeit: 4 Minuten

johns Benutzeravatar
John

Ich muss innerhalb jeder Iteration der Schleife eine Zeichenfolge bilden, die den Schleifenindex enthält i:

for(i=0;i<100;i++) {
  // Shown in java-like code which I need working in c!

  String prefix = "pre_";
  String suffix = "_suff";

  // This is the string I need formed:
  //  e.g. "pre_3_suff"
  String result = prefix + i + suffix;
}

Ich habe versucht, verschiedene Kombinationen von zu verwenden strcat und itoa ohne Glück.

  • Zeigen Sie uns, was Sie versucht haben, anstatt was Sie wollen. Mit Kommentaren zu Ihrem Code lernen Sie viel mehr, als wenn Ihnen jemand sagt, was Sie tun sollen

    – KarlB

    2. März 2011 um 19:09 Uhr


  • Geben Sie Ihr Problem vollständig an … es scheint, dass Sie ein Problem haben, aber welches Problem haben Sie nicht erwähnt? die Saite formt sich nicht oder was?

    – SM Kamran

    2. März 2011 um 19:11 Uhr

  • @SMKamran: Das ist nicht sein Code. Es ist Pseudocode im Java-Stil. Sein Problem ist, dass er nicht weiß, wie man das in C macht.

    – Leichtigkeitsrennen im Orbit

    2. März 2011 um 19:12 Uhr


Leichtigkeitsrennen im Benutzeravatar von Orbit
Leichtigkeitsrennen im Orbit

Strings sind harte Arbeit in C.

#include <stdio.h>

int main()
{
   int i;
   char buf[12];

   for (i = 0; i < 100; i++) {
      snprintf(buf, 12, "pre_%d_suff", i); // puts string into buffer
      printf("%s\n", buf); // outputs so you can see it
   }
}

Das 12 ist genug Bytes, um den Text zu speichern "pre_"der Text "_suff"eine Zeichenfolge mit bis zu zwei Zeichen ("99") und das NULL-Terminator, das am Ende von C-String-Puffer steht.

Dies wird Ihnen sagen, wie Sie es verwenden snprintfaber ich schlage ein gutes C-Buch vor!

  • Ich möchte +1 geben, aber die erste Zeile Ihrer Antwort widerspricht eher dem Rest. Sie haben gezeigt, dass die Lösung tatsächlich einfach ist; Sie müssen nur die Vorstellung verwerfen, dass ineffiziente Idiome zur Zeichenfolgenverkettung aus Skriptsprachen nach C übertragen werden. snprintf ist die Antwort auf fast jede Frage zur Montage von C-Saiten.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    2. März 2011 um 22:06 Uhr

  • @R. Was ich gezeigt habe, ist, dass die Lösung nicht ganz so einfach ist, wie das OP gehofft hatte. Diesen Gedanken „einfach“ zu verwerfen, fällt manchen schwerer als anderen.

    – Leichtigkeitsrennen im Orbit

    2. März 2011 um 22:10 Uhr


  • Auch sollten Sie verwenden snprintfnicht sprintf. Das ist mir beim ersten Lesen entgangen. Ihr Code ist wie geschrieben sehr gefährlich, denn wenn die 100 geändert wird, ohne die Puffergröße zu aktualisieren, werden Sie den Stapel verstopfen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    2. März 2011 um 22:11 Uhr

  • @R. Wenn Sie die 100 ändern, ändern Sie die Puffergröße. Verwenden snprintf ändert das nicht; es bedeutet nur, dass Sie einen weiteren Platz zum Schreiben und Aktualisieren der Puffergröße haben.

    – Leichtigkeitsrennen im Orbit

    2. März 2011 um 22:12 Uhr

  • Der Unterschied besteht darin, dass Ihr Code abstürzt (oder, schlimmer noch, zu einer Kompromittierung von Privilegien führt), wenn jemand vergisst, die Puffergröße zu ändern, während die Version mit snprintf schneidet die Zeichenfolge einfach ab. Auf jeden Fall würde ich die Puffergröße machen 12+3*sizeof(int) und dann müssen Sie sich keine Sorgen machen … aber es wäre immer noch besser zu verwenden snprintf.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    2. März 2011 um 22:44 Uhr

Benutzeravatar von Steve Jessop
Steve Jessop

Verwenden sprintf (oder snprintf wenn Sie wie ich nicht zählen können) mit Formatzeichenfolge "pre_%d_suff".

Für das, was es wert ist, könnten Sie mit itoa/strcat Folgendes tun:

char dst[12] = "pre_";
itoa(i, dst+4, 10);
strcat(dst, "_suff");

  • “was ist itoa“?

    – Antti Haapala – Слава Україні

    11. September 2018 um 6:18 Uhr

  • Entsprechend eine C++-Referenzbezüglich itoaheißt es: „Diese Funktion ist nicht in ANSI-C definiert und nicht Teil von C++, wird aber von einigen Compilern unterstützt.“

    – Gaurang Tandon

    12. September 2018 um 17:58 Uhr

  • @AnttiHaapala–СлаваУкраїні, itoa wandelt ein int in eine Zeichenkette um.

    – Koldsoar

    19. März um 15:54 Uhr

  • @Koldsoar die Anführungszeichen bedeuten: Die Funktion ist nicht Teil der Standard-C-Bibliothek.

    – Antti Haapala – Слава Україні

    21. März um 7:05 Uhr

Ansehen snprintf oder, wenn GNU-Erweiterungen in Ordnung sind, asprintf (was Speicher für Sie zuweist).

  • Den Speicher “für Sie” zuzuweisen, tut Ihnen kaum einen Gefallen. Es gibt eine kleine konstante Grenze für die benötigte Größe, daher ist es viel sinnvoller, den Puffer selbst bereitzustellen. Mit asprintf Sie müssten einen Test für Zuordnungsfehler und Code hinzufügen, um den Puffer später freizugeben.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    2. März 2011 um 22:08 Uhr

1419600cookie-checkWie verkettet man String und Int in C?

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

Privacy policy