2017-02-18 10 views
1

Ich weiß, dass ähnliche Fragen schon vorher gepostet wurden, aber ich konnte das Problem für meinen Fall nicht lösen.Unerwartete Zeichen am Ende des Char-Arrays - C

Ich habe den folgenden C-Code:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    char textChars[4] = { 'A', 'B', 'C', 'D' }; 
    char noMatchChars[4] = { '1', '2', '3', '4' }; 
    int tLengths[5] = { 14, 142, 1414, 14142, 141420 }; 
    int i,j; 

    for (i = 0; i < 1; i++) 
    { 
     char textString1[tLengths[i]+1]; 
     char textString2[tLengths[i]+1]; 
     char textString3[tLengths[i]+1]; 
     char textString4[tLengths[i]+1]; 
     for (j = 0; j < tLengths[i]; j++) 
     { 
      textString1[j] = textChars[0]; 
      textString2[j] = textChars[1]; 
      textString3[j] = textChars[2]; 
      textString4[j] = textChars[3]; 
     } 
     textString1[tLengths[i]] = '\0'; 
     textString2[tLengths[i]] = '\0'; 
     textString3[tLengths[i]] = '\0'; 
     textString4[tLengths[i]] = '\0'; 

     FILE *fp; 
     char filepathPattern[14]; 
     char filepathText[11]; 
     char iChar[1]; 
     sprintf(iChar, "%d", i); 

     strcpy(filepathText, iChar); 
     strcat(filepathText, "_text1.txt"); 
     fp = fopen(filepathText, "w"); 
     fprintf(fp, textString1); 
     fclose(fp); 
     memset(filepathText,0,strlen(filepathText)); 

     strcpy(filepathText, iChar); 
     strcat(filepathText, "_text2.txt"); 
     fp = fopen(filepathText, "w"); 
     fprintf(fp, textString2); 
     fclose(fp); 
     memset(filepathText,0,strlen(filepathText)); 

     strcpy(filepathText, iChar); 
     strcat(filepathText, "_text3.txt"); 
     fp = fopen(filepathText, "w"); 
     fprintf(fp, textString3); 
     fclose(fp); 
     memset(filepathText,0,strlen(filepathText)); 

     strcpy(filepathText, iChar); 
     strcat(filepathText, "_text4.txt"); 
     fp = fopen(filepathText, "w"); 
     fprintf(fp, textString4); 
     fclose(fp); 
    } 
} 

Es ist, als für jede Saite erwarten für textString4 erwartet funktioniert, die Ausgänge als 14 ‚D's, wie durch einen zufälligen Charakter gefolgt erwartet und dann 14‘ C ist (die vorherige Zeichenfolge) aus irgendeinem Grund, aber die anderen Strings haben dieses Problem nicht.

Ich nahm es ein Speicherproblem war, aber als ich
ersetzt char textStringX[tLengths[i]+1];
mit char *textStringX = malloc(sizeof(char) * (tLengths[i] + 1));
das Ergebnis war identisch.

Ich bin neu in C so entschuldigt, wenn die Lösung dafür trivial ist.

+1

Unabhängig vom Wert von 'i', wenn Sie' sprintf (iChar, "% d", i); "*** *** schreiben Sie außerhalb der Grenzen des" iChar "-Arrays. Vergiss den Terminator nicht! –

+0

Auch, warum "schnappst du dich nicht direkt in' filePathText''? Und so ein Copy-Paste-Code sieht aus, das ist ein guter Fall, um den gemeinsamen Code in eine Funktion zu zerlegen. –

+0

'für (i = 0; i <1; i ++)' - Ist das wirklich was du vorhast? 'i' wird nie über den Wert von 0 hinaus gehen. – ryyker

Antwort

1

Die ersten Probleme sind string-bezogen. Die folgenden Zeilen:

char iChar[1]; 
sprintf(iChar, "%d", i); 

sind ein Problem, dass Sie einen char-Array erstellt, iChar, mit Platz für nur ein char, dann in der nächsten Zeile versuchen, eine Zeichenfolge-Funktion verwenden sprintf zwei Zeichen zu setzen in iChar: der Wert i (0 an dieser Stelle) und NULL char. Sie müssen iChar mit mehr Raum schaffen: das heißt

char iChar[3]; // will allow printing up to any two digit value + NULL. 

Eg. Null würde wie folgt aussehen: |0|\0|\0|
99 wie folgt aus: |9|9|\0|

In C, ohne NULL Kündigung, Sie haben keine C string. Die Zeichenfolgenfunktionen funktionieren ohne C-Zeichenfolge nicht ordnungsgemäß.

Da der Schreibvorgang auf iChar im obigen Aufruf fehlschlägt, erwarten die nächsten Zeilen in Ihrem Code auch String-Funktionen immer NULL terminierte char-Arrays. alles andere will sie nicht zu:

strcpy(filepathText, iChar); 
strcat(filepathText, "_text1.txt"); 

Weil ich den Inhalt der Textdatei nicht kennen, ich Ihren Code darüber hinaus nicht nehmen kann. Behandeln Sie diese Zeichenfolgenprobleme, und durchlaufen Sie dann den Code Zeile für Zeile. Ich glaube, dass die meisten Probleme, die Sie anführen, angesprochen werden.

+0

Das Zeichen heißt eigentlich 'NUL', mit einem einzigen L. – Spidey

+0

Ich wusste nicht, über die Null-Zeichen und String-Funktionen vor, so dass es nützlich ist zu wissen.Ich habe iChar Größe auf 2 erhöht und es funktioniert jetzt, aber es speichert als Dateiname "_text1.txt", aber der ganze Punkt von iChar war, die Datei als "0_text1.txt" –

+0

Wie für den Inhalt der Dateien zu speichern sind nicht existent, bis fopen –

Verwandte Themen