我有一个文本文件,其中包含ID和名称全部在一行
314 name1 122 name3 884 name2
ID为3位数(我们将其作为char
处理),然后我们有一个空格,后跟8位数字(包括空格),然后是另一个人的ID /名称等......
所以我打开一个文件,阅读它并希望"切片"它
*我要提及的struct
并不重要,只是一个例子,可以在底部找到
基本上取前三个数字并将它们放在ID下的结构中,然后忽略以下空格,并抓住后面的8位数字并将它们放在名称下的相同结构中,依此类推(只需删除第一个)每次12个数字的文件),问题只是切片
我来自Python,如果我有一个string
,并且只想保留前两位数,我会做string = string[0-2]
//ProductTree is a struct
char initial_s[sizeof(initialStockFile)];
ProdudctTree* temp = NULL;
fscanf(initialStockFile, "%s", initial_s);
temp = malloc(sizeof(ProductTree));
while( initial_s != '\0' ){
temp->id = initial_s[0-9];
temp->productName = initial_s[10-20];
initial_s = initial_s+21;
temp = temp->right;
}
temp->right = NULL;
return temp;
这是我尝试过的,但显然不起作用
结构如果有人好奇
typedef struct ProductTree {
char* id; //Product ID number. This is the key of the search tree.
char* productName; //Name of the product.
struct ProductTree *left, *right;
} ProductTree;
答案 0 :(得分:1)
由于你来自Python,string.split(s[, sep[, maxsplit]])
已经在这里提到了,它在python中做了与str
类似的工作(有一些不同之处:没有默认的分隔符。它确实如此)不返回字符串列表。它只返回第一个拼接,然后您需要再次调用它,NULL
设置为fgets(tmp_str, 13, filename)
)。
但是没有必要使用任何在字符串中搜索某个分隔符的函数,因为您知道要将文件切片为每个12个字符长的字符串(然后将每个字符串切成包含该字符串的字符串)前3个字符和一个包含最后8个字符的字符串,丢弃它们之间的一个字符。)
对于第一部分,将文件切片为12个字符长的字符串,您有两个选项:
'\0'
一次从文件中读取12个字符(大小为13,因为它读取的字符数少于大小,因为它需要多一个字符串以strncpy(tmp_str, &initial_s[i * 12], 12)
结束字符串) i
(假设0
是我们的计数器,从initial_s
开始,文件被读入i * 12
)以复制12个字符,从位置{开始{1}}进入tmp_str(并且不要忘记使用tmp_str[12] = '\0'
终止字符串。对于第二部分,您还有两个选择:
您可以再次使用strncpy()
。这一次首先将3个字符复制到temp->id
,从tmp_str
的乞讨开始。然后将8个字符复制到temp->productName
,从位置4
开始(记住用'\ 0'终止所有字符串)。如果这样做,您可以将struct
更改为具有char数组而不是指向chars的指针:
typedef struct ProductTree {
char id[4]; //Product ID number. This is the key of the search tree.
char productName[9]; //Name of the product.
struct ProductTree *left, *right;
} ProductTree;
或者你可能对第二部分有点“聪明”。让temp->id
指向tmp_str
的开头,让temp->productName
指向tmp_str
中的第5个字符,并将它们之间的空格更改为'\0'
以终止temp->id
1}}:
temp->id = tmp_str;
tmp_str[3] = '\0';
temp->productName = tmp_str[4];
无论您选择哪个选项,请记住为所有字符串分配内存,检查所有输入是否有错误,并在完成后释放字符串和结构。
答案 1 :(得分:0)
您可能想要使用LibC strtok
功能。它允许您在给定分隔符列表的情况下拆分字符串。
以下是与您的项目类似的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
int i;
char *line;
char *tok;
i = 0;
if (!(line = strdup("123 Hello 345 World 678 Foo 901 Bar")))
return EXIT_FAILURE;
tok = strtok(line, " ");
while (tok)
{
if ((i % 2) == 0)
printf("ID: ");
else
printf("Name: ");
puts(tok);
tok = strtok(NULL, " ");
++i;
}
free (line);
return EXIT_SUCCESS;
}
哪个输出:
ID: 123
Name: Hello
ID: 345
Name: World
ID: 678
Name: Foo
ID: 901
Name: Bar