char数组赋值

时间:2013-01-20 17:09:58

标签: c arrays file-handling

我试图将文本文件中的行读入char数组,但是有些错误。请查看代码,让我知道我做错了什么。 感谢。

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int i=0,j;
    char* string[100];
    char line[100];
    FILE *file; 
    file = fopen("patt", "r"); 
    while(fgets(line, sizeof line, file)!=NULL) {
        printf("%d %s",i, line);
        string[i]=line;
        i++;
    }
    for (j=0 ; j<i ; j++) {
        printf("string[%d] %s",j, string[j]);
    }
    fclose(file);
    return 0;
}

输入文件patt具有以下内容。

rec
cent
ece
ce
recent
nt

在执行上面的代码时我得到了这个

0 rec
1 cent
2 ece
3 ce
4 recent
5 nt
string[0] nt
string[1] nt
string[2] nt
string[3] nt
string[4] nt
string[5] nt

我期待的是这个

0 rec
1 cent
2 ece
3 ce
4 recent
5 nt
string[0] rec
string[1] cent
string[2] ece
string[3] ce
string[4] recent
string[5] nt

3 个答案:

答案 0 :(得分:3)

您反复写入同一个数组。

while(fgets(line, sizeof line, file)!=NULL) {

在这一行中,您反复写入数组line


我认为你误解了char* string[100];的作用。您将它用作数组数组,而它实际上是一个包含100个指针的数组。

要解决此问题,您需要先在每次迭代中分配一个新的内存块:

 string[i] = malloc(strlen(line)+1);

然后您需要将line的内容复制到string[i]

strcpy(string[i], line); 

此外,在程序结束时,您需要使用free来释放内存。

答案 1 :(得分:2)

您的string[i]=line;表示您重复将指向同一缓冲区(line)的指针存储到string中的每个连续项目中。像这样:

enter image description here

为了使事情有效,您需要为每个要指定的缓冲区分配一个新的缓冲区,例如:string[i] = dupe_string(line);,其中dupe_string将类似于:

char *dupe_string(char const *in) { 
    char *dupe;
    if (NULL != (dupe = malloc(strlen(in) + 1)))
        strcpy(dupe, in);
    return dupe;
}

请注意,由于这使用malloc为每个字符串分配空间,因此最终需要为每个字符串调用free以避免内存泄漏。

答案 2 :(得分:1)

帮助您理解代码:

  • 每次都在string[i]line的地址,而数组line的内容在整个循环中不断变化。 这导致所有string[i]包含相同变量的地址,即line。 在循环结束时,从文件读取的最后一行存储在line数组中。现在,在打印字符串[i]时,您正在打印变量line中的数据。由于字符串[i]的所有实例都包含line的相同地址,因此它们都在打印相同的值,即输出中的nt
int main(void) {
    int i=0,j;
    char* string[100];
    char line[100];
    FILE *file; 
    file = fopen("patt", "r"); 
    while(fgets(line, sizeof(line), file)!=NULL) {//You missed the ()'s in the sizeof
        printf("%d %s",i, line);
        string[i]=line;
        i++;
    }

*你应该做的是:

int main(void) {
int i=0,j;
char* string[100];
char line[100];
FILE *file; 
file = fopen("patt", "r"); 
while(fgets(line, sizeof(line), file)!=NULL) {//You missed the ()'s in the sizeof
    printf("%d %s",i, line);
    string[i]=malloc(strlen(line)+1); ///You need to allocate some memory to char* string[i] here
    if(string[i] == NULL)//Do a NULL check if malloc failed
      //Handle NULL here
    strncpy(string[i],line,strlen(line)+1);//Use strncpy to copy line into the malloced memory in string[i]
    i++;
}

现在,由于您已经使用内存来存储用于存储数据的内存,因此您也需要释放内存。 所以,代替你的代码:

    for (j=0 ; j<i ; j++) {
        printf("string[%d] %s",j, string[j]);
    }
    fclose(file);
    return 0;
}

这样做:

    for (j=0 ; j<i ; j++) {
    printf("string[%d] %s",j, string[j]);
    free(string[j]);
    }
   fclose(file);
   return 0;
}

现在,那应该能给你你想要的东西。