4 Stimmen

Strcpy String-Array

char kopieren, array[20]

    printf("eingeben ..."):
    scanf("%s", array);

    if (strlen(array) > 20 ) 
      { 
       strcpy(kopieren, array...); 

Was müsste ich tun, um nur die ersten 20 Zeichen zu erfassen, wenn die Eingabe länger als 20 Zeichen ist?

1 Stimmen

Was soll das bedeuten? copy ist überhaupt kein Array. array ist 20 Zeichen lang. array kann einfach nicht länger als 20 Zeichen sein.

0 Stimmen

Du bekommst Overflow mit scanf, wenn du mehr als 20 Bytes eingibst. Schau dir fgets an.

0 Stimmen

@James strncpy beendet das Ergebnis nicht unbedingt mit einem NUL -- fast nie das, was man möchte (der ursprüngliche Zweck war das Kopieren von UNIX-Verzeichniseinträgen, die 14 Bytes lang waren und mit einem NUL abgeschlossen wurden, wenn sie kürzer waren). In jedem Fall ist es hier nicht anwendbar.

5voto

aaz Punkte 5056
char array[20+1];
scanf("%20s", array);

Problem gelöst.

0 Stimmen

+1 für das Lösen des Problems an der Quelle, obwohl ich fgets bevorzugen würde.

1 Stimmen

@Zach - fgets würde '\n' beibehalten.

0 Stimmen

@Zach @aaz Außer im Fall, dass das Array größer als 20 war, was bedeutet, dass Sie auch die Logik hinzufügen müssten, um zu überprüfen, ob es das '\n' beibehalten hat und gegebenenfalls zu ersetzen. Aber auf der anderen Seite der Medaille, mit scanf müssen Sie die Größe des Puffers zweimal angeben (Sie können keinen Integraltyp an den scanf Spezifikator für die Breite übergeben, außer mit plattformspezifischen Erweiterungen, so müssen Sie es einmal als Integer angeben bei der Deklaration des Arrays und erneut in einem String für den scanf Spezifikator [oder etwas Hässliches wie snprintf(spec, sizeof(spec), "%d%%s", sizeof(buf));])

3voto

AnT Punkte 300728

Ihre Frage ist nicht klar, da der Code wenig oder keinen Sinn ergibt. Ihre Eingabe darf nicht länger als 20 Zeichen sein, da das Empfangsarray nur 20 Zeichen enthält. Wenn der Benutzer mehr eingibt, wird Ihr Programm ein undefiniertes Verhalten aufweisen. Das Hauptproblem hier ist also nicht die Begrenzung des Kopierens, sondern die Begrenzung der Eingabe.

Ihre Frage scheint jedoch auf das Kopieren von Zeichenfolgen mit begrenzter Länge abzuzielen. Wenn das ist, was Sie benötigen, gibt es leider keine dedizierte Funktion in der Standardbibliothek für diesen Zweck. Viele Implementierungen bieten die nicht standardmäßige Funktion strlcpy an, die genau das tut. Überprüfen Sie also entweder, ob Ihre Implementierung strlcpy bereitstellt, oder implementieren Sie Ihre eigene strlcpy.

In vielen Fällen sehen Sie vielleicht Ratschläge, strncpy in solchen Fällen zu verwenden. Obwohl es möglich ist, strncpy dazu zu bringen, für diesen Zweck zu funktionieren, ist strncpy in Wirklichkeit nicht dafür gedacht, auf diese Weise verwendet zu werden. Die Verwendung von strncpy als Kopierfunktion für Zeichenfolgen mit begrenzter Länge ist immer ein Fehler. Vermeiden Sie es.

0 Stimmen

Wenn strncpy nicht für diesen Zweck gedacht ist, wofür denken Sie, ist es bestimmt?

0 Stimmen

@Zack: Du kannst darüber in Wikipedia lesen oder hier: stackoverflow.com/questions/2884874/… . Grundsätzlich ist strncpy überhaupt keine Nullterminierungszeichenfunktion und sein Name ist nur ein Missverständnis. Es handelt sich nur um einen historischen Fehler, der in der Standardbibliothek fortbesteht.

0 Stimmen

Ich wäre dankbar für einen Hinweis auf eine tatsächliche Primärquelle für Ihre Behauptung, dass strncpy "erstellt wurde, um 14 Zeichen lange Dateinamenfelder in einer veralteten Version des Unix-Dateisystems zu füllen." Ich sehe es nicht an den Orten, auf die Sie verweisen.

1voto

zwol Punkte 128461

Verwenden Sie strncpy anstelle von strcpy. Das ist alles, was du tun musst. (Vorsicht: strncpy beendet den Zielsatz nicht mit einem Nullzeichen, wenn es sein Limit erreicht.)

BEARBEITEN: Ich habe Ihr Programm nicht sorgfältig genug gelesen. Sie verlieren bereits beim scanf-Aufruf, wenn die Benutzereingabe länger als 20 Zeichen ist. Sie sollten stattdessen fgets aufrufen. (Persönlich denke ich, dass *scanf nie verwendet werden sollte - dies ist nur die Spitze des Eisbergs, was Probleme verursachen kann.) Außerdem hat copy nur Platz für ein Zeichen, nicht für zwanzig; aber ich gehe davon aus, dass dies ein Tippfehler ist.

0 Stimmen

Warum magst du scanf nicht?

1 Stimmen

@cokedude 1) Abhängig vom Format-String kann es genauso gefährlich sein wie gets (wie diese Frage zeigt); 2) numerischer Überlauf löst undefiniertes Verhalten aus, d.h. scanf("%d", &x) darf abstürzen, wenn der Benutzer zu viele Ziffern eingibt; 3) Das Schreiben eines Parsers, der robust gegen fehlerhafte Eingaben ist, ist einfacher, wenn du nicht scanf verwendest.

1voto

Fábio Perez Punkte 20762

Alternativ können Sie strcpy nicht verwenden, um nur 20 Zeichen zu lesen (und Sie müssen nicht strings.h einbeziehen):

char c;
for( i = 0; i < 20; i++ ) {
    c = getchar();
    if (c != '\n') array[i] = c;
    else break;
}
array[i+1] = '\0';

Vergessen Sie nicht, das Array als char array[21] zu deklarieren, um sicherzustellen, dass '\0' eingeschlossen wird.

0voto

Verwenden Sie strncpy. Stellen Sie sicher, dass das Ziel mit einem Nullzeichen terminiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X