将字符串的内容解析为子字符串

时间:2016-02-15 02:31:09

标签: c linux string

我试图从文件中读取一个字符串,然后解析字符串的内容以确定使用fork()创建多少个子节点,并向每个子节点发送字符串的一部分。

int main() {    
    FILE * fp = fopen("Makefiletest", "r");
    char * s;
    int i;
    char * e;
    int c;

    for (c = 0; c < 7; c++) {
        fgets(s, 128, fp);
    }
    //e = strchr(s, ":");
    //i = (int)(e - s);
    //printf("index of : is %d\n", i); 
    printf("%s", s);
    for (i = 0; s[i]; s[i]=='.' ? i++ : *s++);
    printf("%d\n", i);

    return 0;
}

检索&#34; maketools.a: parse.o find.o&#34; maketools.a是第二代孩子(将从其父级收到字符串&#34; maketools.a&#34;)并且需要创建2个新的第3代孩子,其中一个字符串为&# 34; parse.o&#34;另一个与&#34; find.o&#34;。

由于分段错误,我无法获得:的索引时遇到了死胡同(它被注释掉并替换为我尝试用计数代替字符串的尝试(它失败了) )),这阻止我分割字符串。

更新

    int main() {    
    FILE * fp = fopen("Makefiletest", "r");
    char * s[256];
    int i, index, ind;
    char * e;
    int c;

    for (c = 0; c < 7; c++) {
        fgets(s, 128, fp);
    }
    e = strchr(s, ":");
    index = (int)(e - s);
    printf("index of : is %d\n", index); 
    printf("%s", s);

    return 0;
}

更新2

int main () {   
    char fgets_string[256];
    char * fgets_string_ptr = fgets_string;
    strcpy(fgets_string_ptr, "      maketools.a:                      parse.o    find.o   ");
    char depen[6][128]; //[0][] is root, 1+ are dependencies
    char * depen_ptr;
    int c;

    while (isspace(* fgets_string_ptr)) {//removes leading whitepace
        fgets_string_ptr++;
    }
    for (c = 0; strlen(fgets_string_ptr) > 0; c++) {
        if (c == 0)
            strtok_r(fgets_string_ptr, ":", &depen_ptr);
        else {
            strtok_r(fgets_string_ptr, " ", &depen_ptr);
        }
        while (isspace(* depen_ptr)) {//removes leading whitespace
            depen_ptr++;
        }
        strcpy(depen[c], fgets_string_ptr);
        strcpy(fgets_string_ptr, depen_ptr);
        //printf("%s\n", depen[c]);
    }

    printf("%s\n", depen[0]);
    printf("%s\n", depen[1]);
    printf("%s\n", depen[2]);   

    return 0;
}

1 个答案:

答案 0 :(得分:0)

以下是实现您想要的不同方法...代码的输出是

~/code/str % clang a.c -I../zstring -Wno-unused-value
~/code/str % ./a.out 
maketools.a
parse.o
find.o
~/code/str % 

不是首先找到:字符并处理空格,而是先将(空格)作为分隔符将字符串拆分为标记,然后对于第一个字符串,您可以删除:个字符。

下面的代码使用我维护的字符串库,可以从https://github.com/fnoyanisi/zString下载(可获得BSD许可证)

#include <stdio.h>
#include <zstring.h>

int main(){
    char s[]="maketools.a: parse.o find.o";

    printf("%s\n",zStrrmv(zStrtok(s," "),":"));
    printf("%s\n",zStrtok(NULL," "));
    printf("%s\n",zStrtok(NULL," "));

    return 0;
}