C程序从字符串数组中提取不同的子字符串

时间:2014-10-15 09:15:29

标签: c arrays string file

我想从包含字符串数组的文件中提取不同的子字符串。我的文件类似于此。

abcdxxx
efghijkyyy
lmzzz
ncdslanclsppp
kdfmsqqq
cbskdnsrrr 

从上面的文件中我想提取xxx,yyy,zzz,ppp,qqq,rrr(基本上是最后3个字符)并存储到数组中。我提到这个链接How to extract a substring from a string in C?但感觉不可行,因为我的文件中的内容是动态的,可能会因下次执行而改变。有人能简单介绍一下吗? 这是我的方法

     FILE* fp1 = fopen("test.txt","r");
     if(fp1 == NULL)
     {
        printf("Failed to open file\n");
        return 1;
     }
     char array[100];
     while(fscanf(fp1,"%[^\n]",array)!=NULL);

     for(i=1;i<=6;i++)
     {
        array[i] += 4;
     }

1 个答案:

答案 0 :(得分:1)

  

我文件中的内容是动态的,可能会因下次执行而改变

然后您需要realloc或链接列表:

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

int main(void)
{
    FILE *f;
    char **arr = NULL;
    char s[100];
    size_t i, n = 0;

    f = fopen("text.txt", "r");
    if (f == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    while (fgets(s, sizeof s, f) != NULL) {
        arr = realloc(arr, sizeof(*arr) * (n + 1));
        arr[n] = calloc(4, 1);
        memcpy(arr[n++], s + strlen(s) - 4, 3);
    }
    fclose(f);
    for (i = 0; i < n; i++) {
        printf("%s\n", arr[i]);
        free(arr[i]);
    }
    free(arr);
    return 0;
}

输出:

xxx
yyy
zzz
ppp
qqq
rrr

如果你总是想要最后3个字符,你可以简化:

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

int main(void)
{
    FILE *f;
    char (*arr)[4] = NULL;
    char s[100];
    size_t i, n = 0;

    f = fopen("text.txt", "r");
    if (f == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    while (fgets(s, sizeof s, f) != NULL) {
        arr = realloc(arr, sizeof(*arr) * (n + 1));
        memcpy(arr[n], s + strlen(s) - 4, 3);
        arr[n++][3] = '\0';
    }
    fclose(f);
    for (i = 0; i < n; i++) {
        printf("%s\n", arr[i]);
    }
    free(arr);
    return 0;
}