簡體   English   中英

在C中打印出字符串數組

[英]Printing out an array of strings in C

我試圖讀取一個10行的文件,如下所示:

000000 52.3 65.2 98.7 96.3 100.0 25.0 95.6 98.7 82.5 63.1
111111 81.0 68.6 54.2 96.3 74.2 78.6 98.5 62.1 64.7 75.0
222222 52.6 63.5 25.4 42.6 32.0 22.1 52.3 96.6 98.5 63.2
333333 98.2 65.3 65.4 93.5 32.6 37.5 63.5 91.0 96.3 82.5
444444 96.3 85.2 74.1 36.9 25.8 14.7 12.3 13.4 63.5 98.4
555555 93.6 82.5 74.1 63.1 65.2 63.5 98.7 63.2 63.8 64.0
666666 95.2 61.5 97.8 52.3 63.3 33.3 44.4 55.5 66.6 77.7
777777 11.1 22.2 33.3 44.4 55.5 66.6 77.7 88.8 99.9 100.0
888888 12.3 23.4 34.5 45.6 56.7 67.8 78.9 89.1 91.1 98.1
999999 98.7 87.6 76.5 65.4 54.3 43.2 32.1 21.0 52.9 87.1

我需要逐行將文件讀取為字符串,所以目前我有:

#include<stdio.h>

int main()
{
    FILE *p;
    char *line[10], *buffer; //Array of strings and a buffer string
    int a;
    p = fopen("assign6.dat", "r+");
    for(a = 0; a < 10; a++) {
        fscanf(p, "%[^\n]", buffer); //Read until we reach a newline
        fgetc(p); //Read the newline
        line[a] = buffer;
        printf("%s\n", line[a]);
    }
    for(a = 0; a < 10; a++) {
        printf("%s\n", line[a]);
    }
    fclose(p);
    return 0;
}

所以我聲明了一個指向char的指針數組來存儲所有10行數據。 第一個printf語句打印出正確的數據。 但是,第二個for循環內的第二個printf語句一遍又一遍地打印文件的最后一行(10次)。 那么,為什么這些printf語句在同一事物上打印出我們不同的事物。

復制字符串

您將需要更改此:

line[a] = buffer;

對此:

strcpy(line[a], buffer);

它會工作。 原因是line[a]buffer是指針,並且通過使它們相等,您最終將指向內存中的相同地址。

什么是strcpy?

是這種情況嗎?

分配內存

您需要為字符串分配內存,但尚未這樣做。

從您的文件來看,更改以下內容:

char *line[10], *buffer;

對此

char line[10][129], buffer[129];

是一個快速的解決方案。 我分配了129個字符,因為文件的字符串的最大長度為6,我們需要為null character再留一個空間。 您可以隨意更改。 否則,您可能要動態分配內存。

如何使用malloc動態分配內存

因為緩沖區是指向內存的指針。 每次運行fscan()時,緩沖區指向的字符串都會被寫入,並且line [a]都具有緩沖區指針的值,因此它們都指向相同的內存位置。 在該位置僅存儲最后一行。

您需要通過使用以下命令來存儲每一行

strcpy(line[a], buffer); // Instead of line[a] = buffer;

兩個問題:

沒有為buffer分配內存。

fscanf(p, "%[^\n]", buffer);

沒有為line[a]分配內存

line[a] = buffer;

使用預分配的緩沖區讀取文件和使用字符串進行進一步復制可能會很方便。

enum {MaxLineLength = 128};
char buffer[MaxLineLength];

string line[10];

注意,對於buffer ,程序在實際讀取之前無法知道實際長度,因此需要長度的上限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM