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

标签 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;
}

它检索行“maketools.a: parse.o find.omaketools.a 是第 2 代子代(将从其父代收到字符串“maketools.a”),需要创建 2 个新的第 3 代子代,其中一个具有字符串“parse.o”,另一个是“find.o”。

由于段错误而无法获取 : 的索引,我陷入了死胡同(它被注释掉并替换为我试图用计数而不是字符串进行的尝试(它失败了)),这阻止了我分割字符串。

更新

    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;
}

最佳答案

下面是一种不同的方法来实现你想要的......代码的输出是

~/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;
}

关于c - 将字符串的内容解析为子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35400640/

相关文章:

C++ unordered_map<string, ...> 不构造字符串的查找

c - C语言函数返回多个值的方法

c - 合并两个数组并省略所有重复元素

清除一个小整数数组 : memset vs. for 循环

将 HEX 值转换为(字符、字符串、字母和数字)

linux - Shellscript If 语句返回错误

c - 运行 xterm 并使用 c 显示文件内容

linux - 为什么超时在 bash 脚本中不起作用?

c# - edmx 文件在单独的项目中时出错

c++ - 为什么我不能正常初始化 typedef struct string 或 char?