我正在尝试从文件中读取一个字符串,然后解析该字符串的内容以确定使用 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.o
”
maketools.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/