我正在尝试在字符串行上使用strtok()并将其元素放入结构元素中 但我不能写出正确的代码......请任何帮助
这是主要的
store book;
char line[80];
printf("Insert book as:'title','author','publisher','ISBN','date of publication',and'category'\n");
gets(line);
char *p;
char s[2]=",";
p=strtok(line,s);
结构
typedef struct bookStore{
char title[80];
char author[80];
char ISBN[20];
char date[20];
int numOfCopy;
int currNumOfcopy;
char category[20];
}store;
答案 0 :(得分:1)
您打印以下内容:
printf("Insert book as:'title','author','publisher','ISBN','date of publication',and'category'\n");
然而你的结构对发布者一无所知。
它还包含两个字段,其中包含80个字符长和3个字段,这些字段长度为20个字符,但是您只为要解析的字符串分配了80个字符缓冲区。
这是C中错误存在的功能之一。永远不应该使用它,因为它会使您的程序容易受到堆栈溢出(安全问题,而不是此站点;)。)。
这是填写行变量的正确方法。
fgets(line,80,stdin);
您使用输入字符串调用它来获取第一个标记,就像您一样,然后您需要使用NULL而不是输入字符串来调用它以获取下一个标记。您会知道,当字符串返回NULL时,字符串中不再有令牌。
此函数使用静态变量保持内部状态,这是一种不好的做法。在大多数情况下应该避免这种做法。
你可以使用strcpy来表示字符串,你需要#include<string.h>
p=strtok(line,s);
length = strlen(p); /* length should be declared int where you declare your variables */
if (length > 79) {
printf("You entered title which is %d characters, but 79 were expected", length);
exit(1);
}
strcpy(book.title, p); /* It's safe, because we already checked the length of the string */
}
如果您需要填充数字,则必须使用sscanf
int number;
sscanf(p,"%d", book.numOfCopy);