为什么不打印阵列?

时间:2014-10-24 22:23:59

标签: c arrays file pointers

我想从文件中获取内容并以随机顺序打印出来。现在我只是尝试从文件中取出内容并将其打印出来。例如,现在文件有:

0 Abdelmeged Zane
1 Attri Sonal

它打印出的第二行不是第一行。

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

int main(int argc, char* argv[]){
   FILE *file;
   char string[50];
   char array[100];
   int i = 0;
   char *p;

   file = fopen(argv[1], "r");
   if(file == NULL) {
      perror("Error opening file");
      return(-1);
   }

   printf("\nOriginal Array: \n");
   while(fgets(string, 100, file)!= NULL) {
       printf(string);
       p = &array[i];
       strcpy(p, string);
       i++;
   }

   i = 0;
   printf("\nShuffled Array: \n");
   while(i < 20){
       printf("%c", array[i]);
       i++;
   }

   fclose(file);
   return(0);
}

2 个答案:

答案 0 :(得分:2)

您的代码存在的问题是,您char array[100];循环的每次迭代都声明strcpy(p, string);,然后基本上覆盖您使用while存储在其中的字符串。在这种情况下,不需要使用指针p。您需要做的是分配多个指针来保存多个字符串。通常的方法是分配一些指针(下面的10个 - 参见MAXLINES),然后在使用每个指针时为每个字符串分配空间。以下是一个快速示例(请注意,有许多不同的方法可以执行此操作)。此外,由于您正在分配内存,因此您也有责任将其释放(也如下所示)。如果您有疑问,请发表评论。

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

#define MAXLINES 10

int main(int argc, char* argv[]){
    FILE *file;
    char string[50];
    char **array = NULL;
    int i = 0;

    if (argc < 2) {
        fprintf (stderr, "Error: insufficient input. Usage: %s <filename>\n", argv[0]);
        return 1;
    }

    file = fopen(argv[1], "r");
    if(file == NULL) {
        perror("Error opening file");
        return 1;
    }

    array = calloc (MAXLINES, sizeof (*array));    /* MAXLINES char pointers */
    if (!array) {
        fprintf (stderr, "Error: calloc pointer allocation failed\n");
        return 1;
    }


    printf("\nOriginal Array: \n");
    while(fgets(string, 100, file)!= NULL) {
        printf("  %s", string);
        array[i] = strdup (string); /* strdup allocates space for string    */
        i++;
    }

    fclose(file);                    /* close it here, you are done with it */

    i = 0;                           /* print array stored in memory        */
    printf("\nShuffled Array: \n");
    while (array[i])
    {
        printf("  %s", array[i]);
        i++;
    }

    i = 0;
    while (array[i])                /* free memory dynamically allocated:   */
    {
        free (array[i]);            /* free array/string memory             */
        i++;
    }
    if (array) free (array);        /* free pointer allocation              */

    return 0;
}

注意:您还应该使用fgets(例如int numlines = i;)保存循环后读取的字符串数量。在重置i = 0;之前 之前执行此操作。这样你就可以方便地引用你的shuffle中使用的字符串数量。 (您也可以使用while (array[i])循环再次计算它们,但为什么?

输入文件:

$ cat dat/abde.txt
0 Abdelmeged Zane
1 Attri Sonal

<强>输出:

$ ./bin/shufs dat/abde.txt

Original Array:
  0 Abdelmeged Zane
  1 Attri Sonal

Shuffled Array:
  0 Abdelmeged Zane
  1 Attri Sonal

答案 1 :(得分:1)

您正在将读取的字符串复制到第二个char数组中,每次将起点偏移一个。所以最后,假设你没有缓冲区溢出,那么你的array将把每行的第一个字符保存到最后一个字符,它将完整地保存。

根据您在研究中的位置,创建一个字符数组的静态数组来保存每一行,或创建一个指针数组并malloc保存的副本。