我试图从文件中读取一个字符串,然后解析字符串的内容以确定使用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;
}
答案 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;
}