在strtok()之后的结构中存储日期来自文件的字符串行

时间:2013-12-12 22:21:04

标签: c

我正在尝试在字符串行上使用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;

1 个答案:

答案 0 :(得分:1)

STRUCT

您打印以下内容:

printf("Insert book as:'title','author','publisher','ISBN','date of publication',and'category'\n");

然而你的结构对发布者一无所知。

它还包含两个字段,其中包含80个字符长和3个字段,这些字段长度为20个字符,但是您只为要解析的字符串分配了80个字符缓冲区。

这是C中错误存在的功能之一。永远不应该使用它,因为它会使您的程序容易受到堆栈溢出(安全问题,而不是此站点;)。)。

这是填写行变量的正确方法。

  fgets(line,80,stdin);

的strtok

您使用输入字符串调用它来获取第一个标记,就像您一样,然后您需要使用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);