Ich habe eine Zeichenfolge:
char * someString;
Wenn ich die ersten fünf Buchstaben dieser Zeichenfolge möchte und auf setzen möchte otherString
wie würde ich es tun?
SuperString
Ich habe eine Zeichenfolge:
char * someString;
Wenn ich die ersten fünf Buchstaben dieser Zeichenfolge möchte und auf setzen möchte otherString
wie würde ich es tun?
pib
#include <string.h>
...
char otherString[6]; // note 6, not 5, there's one there for the null terminator
...
strncpy(otherString, someString, 5);
otherString[5] = '\0'; // place the null terminator
Oder otherString[5] = (char)0;
Wenn Sie wählerisch sein wollen. Char ist ein ganzzahliger Typ, daher werden (oder sollten) sich Compiler nicht darüber beschweren, ihm einfach eine rohe Ganzzahl zuzuweisen.
– pib
24. Januar 2010 um 17:47 Uhr
Vielen Dank, dass Sie mich daran erinnert haben, das Abschlusszeichen in einfache Anführungszeichen statt in doppelte Anführungszeichen zu setzen.
– Möwe
12. September 2017 um 14:49 Uhr
@pib Kommentar unklar. Beide otherString[5] = '\0';
und otherString[5] = 0;
in C, weisen eine zu int
mit einem Wert von 0 bis a char
. Also wie funktioniert (char)
Hilfe in otherString[5] = (char)0;
?
– chux – Wiedereinsetzung von Monica
24. Juli 2018 um 17:48 Uhr
Das ist ein schlechter Rat. strncpy
ist eine gefährliche Funktion, die niemals verwendet werden sollte, da viel zu viele Menschen nicht verstehen, wie sie funktioniert. In diesem Fall strncpy
kann die Zeichenfolge selbst je nach Länge mit Null beenden oder nicht. Es ist unbeständig, unzuverlässig und ursprünglich überhaupt nicht für die Verwendung mit nullterminierten Zeichenfolgen gedacht. Sehen Ist strcpy gefährlich und was sollte stattdessen verwendet werden?
– Ludin
10. März um 7:24 Uhr
Verallgemeinert:
char* subString (const char* input, int offset, int len, char* dest)
{
int input_len = strlen (input);
if (offset + len > input_len)
{
return NULL;
}
strncpy (dest, input + offset, len);
return dest;
}
char dest[80];
const char* source = "hello world";
if (subString (source, 0, 5, dest))
{
printf ("%s\n", dest);
}
es wird besser, wenn ‘\0’ am Ziel hinzugefügt wird[len+1] nein?
– José Linares
5. März 2016 um 11:35 Uhr
Hier gibt es einen subtilen Fehler; Sie müssen if(offset + len) in if(offset) ändern, sonst werden die letzten Zeichen der Zeichenfolge nie gelesen; zum Beispiel: cpp.sh/955ib
– Blaskovicz
3. Juli 2020 um 2:46 Uhr
Liao
char* someString = "abcdedgh";
char* otherString = 0;
otherString = (char*)malloc(5+1);
memcpy(otherString,someString,5);
otherString[5] = 0;
AKTUALISIEREN:
Tipp: Eine gute Möglichkeit, Definitionen zu verstehen, ist die Rechts-Links-Regel (einige Links am Ende):
Beginnen Sie mit dem Vorlesen ab Kennung und sagen Sie laut => “someString
ist…”
Gehen Sie nun rechts von someString (Anweisung wurde mit einem Semikolon beendet, nichts zu sagen).
Gehen Sie nun links von der Kennung (*
gefunden wird) => sagen Sie also “…ein Zeiger auf…”.
Gehen Sie jetzt nach links von “*
“ (das Stichwort char
gefunden wird) => sage “..char”.
Fertig!
So char* someString;
=> “someString ist ein Zeiger auf char”.
Da ein Zeiger einfach auf eine bestimmte Speicheradresse zeigt, kann er auch als “Startpunkt” für ein “Array” von Zeichen verwendet werden.
Das funktioniert mit allem. Probieren Sie es aus:
char* s[2]; //=> s is an array of two pointers to char
char** someThing; //=> someThing is a pointer to a pointer to char.
//Note: We look in the brackets first, and then move outward
char (* s)[2]; //=> s is a pointer to an array of two char
Einige Links:
Wie man komplexe C/C++-Deklarationen interpretiert und
So lesen Sie C-Deklarationen
Ich denke, Sie sollten versuchen, zu kompilieren char *[] someThing;
und char []* someThing;
. Sie wollen char *someThing[];
und char (*someThing)[];
beziehungsweise. Und das bricht Ihren Algorithmus, um Definitionen zu verstehen.
– Alok Singhal
22. Januar 2010 um 2:50 Uhr
//Danke, Sie haben Recht mit der schlechten Syntax..den Code korrigiert. Der Algorithmus steht jedoch noch, siehe Update.
– Liao
22. Januar 2010 um 23:41 Uhr
Vergessen Sie nicht, nach Malloc zu befreien
– ShihabSoft
8. März 2016 um 20:04 Uhr
memcpy(someString, otherString, 5);
kann undefiniertes Verhalten haben, wenn someString
hat weniger als 4 Zeichen. In Ihrem Beispiel funktioniert es, weil die Quellzeichenfolge länger ist, aber das Verhalten für kleine Quellzeichenfolgen nicht vollständig definiert ist.
– chqrlie
16. Juli um 12:10 Uhr
Sie müssen Speicher für die neue Zeichenfolge otherString zuweisen. Im Allgemeinen kann für eine Teilzeichenfolge der Länge n so etwas für Sie funktionieren (vergessen Sie nicht, die Grenzen zu überprüfen …)
char *subString(char *someString, int n)
{
char *new = malloc(sizeof(char)*n+1);
strncpy(new, someString, n);
new[n] = '\0';
return new;
}
Dies gibt einen Teilstring der ersten n Zeichen von someString zurück. Stellen Sie sicher, dass Sie den Speicher freigeben, wenn Sie damit fertig sind, indem Sie free() verwenden.
angelvmx
Sie können snprintf verwenden, um einen Teilstring eines char-Arrays mit Genauigkeit zu erhalten. Hier ist ein Dateibeispiel mit dem Namen “substring.c”:
#include <stdio.h>
int main()
{
const char source[] = "This is a string array";
char dest[17];
// get first 16 characters using precision
snprintf(dest, sizeof(dest), "%.16s", source);
// print substring
puts(dest);
} // end main
Ausgabe:
Dies ist eine Zeichenfolge
Notiz:
Weitere Informationen finden Sie auf der man-Seite von printf.
Ich bin mir nicht sicher, was das kostet, aber die Tatsache, dass nur eine einzige Standard-Lib verwendet wird, um diese Operation durchzuführen, ist irgendwie bemerkenswert
– PYK
4. Juli 2018 um 6:33 Uhr
Calvinjarrod
Sie können C-Strings wie Zeiger behandeln. Wenn Sie also erklären:
char str[10];
Str kann als Zeiger verwendet werden. Wenn Sie also nur einen Teil der Zeichenfolge kopieren möchten, können Sie Folgendes verwenden:
char str1[24] = "This is a simple string.";
char str2[6];
strncpy(str1 + 10, str2,6);
Dadurch werden 6 Zeichen aus der kopiert str1 Array hinein str2 ab dem 11. Element.
Ich bin mir nicht sicher, was das kostet, aber die Tatsache, dass nur eine einzige Standard-Lib verwendet wird, um diese Operation durchzuführen, ist irgendwie bemerkenswert
– PYK
4. Juli 2018 um 6:33 Uhr
Ich denke, es ist ein einfacher Weg … aber ich weiß nicht, wie ich die Ergebnisvariable direkt übergeben kann, dann erstelle ich ein lokales Char-Array als Temp und gebe es zurück.
char* substr(char *buff, uint8_t start,uint8_t len, char* substr)
{
strncpy(substr, buff+start, len);
substr[len] = 0;
return substr;
}
start
und len
Typ haben sollte size_t
nicht uint8_t
– chqrlie
16. Juli um 12:08 Uhr
someString ist kein String, sondern ein Zeiger auf eine Zeichenkette. Außerdem sind Zeichen nicht unbedingt Buchstaben. Sie müssen wissen, was eine Zeichenfolge ist, bevor Sie Buchstaben verschieben können.
– Benutzer14554
22. Januar 2010 um 1:51 Uhr
Je nach Bedarf ist es besser, ein char-Array der Größe 6 für otherstring (5 + ein Byte für ‘\0’) zu deklarieren. Auf diese Weise müssen Sie sich nicht um Speicherlecks kümmern, falls Sie vergessen, andere Zeichenfolgen nach der Verwendung freizugeben.
– HierzuLernen
22. Januar 2010 um 2:20 Uhr
Ich stimme dafür, diese Frage zu schließen, weil sie neuen Benutzern beibringt, wie man sie falsch stellt, selbst die Abstimmung sollte deaktiviert werden.
– Wolf
26. Januar 2021 um 9:04 Uhr
Warnung: Diese alte Frage kommt mit einer Flut von sehr schlechten Antworten, die gefährliche oder falsche/fehlerhafte Praktiken lehren. Einige lassen sich nicht einmal kompilieren. Ich rate dem Leser, diesen Beitrag zu vermeiden oder ansonsten zu der Antwort zu scrollen, die ich gerade gepostet habe. Ich empfehle auch dringend, alle schrecklichen Antworten abzulehnen, insbesondere diejenigen mit regelrechten Fehlern und Compilerfehlern.
– Ludin
10. März um 7:46