2013-04-04 156 views
1

我正在写一个C代码来逐行读取包含字母,CR,LF,'\ 0'的行。以下是我附带的代码示例。我只想将每行的字母存储到数组中,以便数组中的行数等于文件中行的数量,并且列的长度应该是变化的(取决于第i行中的字符数)。不同长度的字符串数组

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

int main() 
{ 
    char *buffer[100]; 
    char temp[128]; 
    int c,i=0,j=0; 
    int pos=0; 
    FILE *file; 
    file = fopen("input", "r"); 
    if (file) { 
     while ((c = getc(file)) != EOF){ 
      if ((c>=65 && c<=90) || (c>=97 && c<=122)) 
       temp[pos++]=c; 
      else if(pos>1) { 
       temp[pos]='\0'; 
       buffer[i]=temp; 
       printf ("%s\n",temp); 
       i++; 
       pos=0; 
      } 
     } 
    } 
    fclose(file); 
    while (j<i){ 
     printf("%s\n",buffer[j]); 
     j++; 
    } 
} 

如果我运行我的上面的代码,我所有的缓冲区[j]包含相同的字符串。 任何人都可以帮助我找出代码中的错误。

+2

**如果你问它,**调试器**会急切地执行任务*真正好*。除此之外,问问自己:“每当我进入一个新字符串时,我在那个指针数组中存储了什么?它是否是同一个缓冲区地址(temp)一遍又一遍?” – WhozCraig 2013-04-04 12:49:35

回答

2

buffer[]指针数组,你while循环他们每个人你是指向你的阵列temp[]

buffer[i]=temp; // assign the address of temp to buffer[i] 

然后你改变你的temp[]阵列的内容,但地址总是一样的。

如果你想temp您需要分配内存和那边的数据复制数据到每个位置buffer[]。更像是:

buffer[i]=malloc(strlen(temp) + 1); 
strcpy(buffer[i], temp); 
+0

+1或者'buffer [i] = strdup(temp)'如果你感觉特别是POSIX-ish那天早上= P。很好的答案。 – WhozCraig 2013-04-04 12:57:37

+2

@WhozCraig即使你感觉POSIX-ish,坚持标准C.没有理由在任何地方使用strdup。 – Lundin 2013-04-04 13:00:23

+0

@Lundin我会记住这一点。有人必须有一些拉,因为POSIX.1-2001之前它不是POSIX标准的一部分。 – WhozCraig 2013-04-04 13:04:14

相关问题