我从文件中读取一个字符串并将其存储到一个数组中,但我怎么知道数组的长度?

时间:2012-11-10 02:07:03

标签: c arrays string input

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

int main()
{
    int i = 0, len1=0, len2=0;
    int BUFSIZE = 1000;
    char* string1[20];
    char* string2[20];
    FILE *fp1 = fopen("input1.txt", "r");
    FILE *fp2 = fopen("input2.txt", "r");
    if ((fp1 == 0)||(fp2 == 0)){
        fprintf(stderr, "Error while opening");
        return 0;
    }
    string1[i] = (char*)malloc(BUFSIZE);
    string2[i] = (char*)malloc(BUFSIZE);
    while (fgets(string1[i], BUFSIZE, fp1)) {
        i++;
        len1+=strlen(string[i]);
        string1[i] = (char*)malloc(BUFSIZE);
        len1+=strlen(string1[i]);
    }

    i = 0;
    while (fgets(string2[i], BUFSIZE, fp2)) {
        i++;
        string2[i] = (char*)malloc(BUFSIZE);
    }

    printf("Output: \n");
    srand(time(NULL));
    int j = rand()%i;
    int k = (j+1)%i;
    fflush(stdout);
    printf("%d - %s %d -%s", j, string1[j], k, string1[k]);
    printf("%d - %s %d -%s", j, string2[j], k, string2[k]);
    printf("\n");
    printf("%d", len1);

    int x;
    for(x = 0; x<i; x++){
        free(string1[x]);
        free(string2[x]);
    }
    scanf("%d", x);
    fclose(fp1);
    fclose(fp2);
    return 0;
}

感谢user1807597的帮助,我终于实现了读取两个字符串并存储到数组中。但是我仍然无法获得数组的长度,我尝试将len + = strlen(string [i]);在while循环中,但编译器在调试时中断。有人知道为什么吗?谢谢!

2 个答案:

答案 0 :(得分:4)

对于数组的长度,您有两个主要选择。

  1. 你做得足够大,以至于你认为你不会使用更多的参赛作品。

    enum { MAX_LINES = 16 * 1024 };
    char *lines[MAX_LINES];
    size_t num_lines = 0;
    
  2. 您可以动态分配数组。

    char **lines = 0;
    size_t max_lines = 0;
    size_t num_lines = 0;
    
    ...
    
    if (num_lines >= max_lines)
    {
        size_t new_lines = max_lines * 2 + 2;
        char **space = realloc(lines, new_lines * sizeof(*space));
        if (space == 0)
            ...deal with out of memory...
        lines = space;
        max_lines = new_lines;
    }
    
  3. 两个系统都有效。动态分配在前几次执行时会更加繁琐,但是在内存不足之前不会遇到问题,而且这些天耗尽内存需要很长时间。如果您猜错了,固定分配可能会耗尽空间,如果您只处理小文件,则名义上会浪费内存。这些日子里,“浪费”的记忆通常非常小。

    哪个更好取决于您希望程序处理的问题的规模。如果它们很小,固定但慷慨的分配是明智和容易的。如果它们很大,动态分配就更明智了。

答案 1 :(得分:1)

我已经修改了代码。我想现在没关系。你在第一个while循环中计数错误。i++应该在len1+=strlen(string[i]);之后。在上一个scanf语句中scanf("%d", x); ,你错过了运营商'&amp;'。

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

int main()
{
    int i = 0, len1 = 0, len2 = 0;
    int BUFSIZE = 1000;
    /*
       you have too  few lines here,
       If my file contains more than 20 lines,tragedy will occur!
       */
    char* string1[20];
    char* string2[20];

    FILE* fp1 = fopen("input1.txt", "r");
    FILE* fp2 = fopen("input2.txt", "r");

    if ((fp1 == 0) || (fp2 == 0))
    {
        fprintf(stderr, "Error while opening");
        return 0;
    }
    string1[i] = (char*)malloc(BUFSIZE);
    string2[i] = (char*)malloc(BUFSIZE);

    while (fgets(string1[i], BUFSIZE, fp1)!=NULL)
    {
        /*
        i++;
        */

        len1 += strlen(string1[i]);
        i++;
        string1[i] = (char*)malloc(BUFSIZE);
    }

    i = 0;
    while (fgets(string2[i], BUFSIZE, fp2))
    {
        i++;
        string2[i] = (char*)malloc(BUFSIZE);
    }

    printf("Output: \n");
    srand(time(NULL));
    int j = rand() % i;
    int k = (j + 1) % i;
    fflush(stdout);
    printf("%d - %s %d -%s", j, string1[j], k, string1[k]);
    printf("%d - %s %d -%s", j, string2[j], k, string2[k]);
    printf("\n");
    printf("%d", len1);

    int x;
    for (x = 0; x < i; x++)
    {
        free(string1[x]);
        free(string2[x]);
    }
    /*
    scanf("%d", x);
    */
    scanf("%d",&x);
    fclose(fp1);
    fclose(fp2);
    return 0;
}