使用指针和strtok()

我正在构建一个链表,需要你的帮助,因为我是C的新手。我需要输入一个如下所示的字符串:( (word)_#_(year)_#_(DEFINITION(UPPER CASE))

例如:输入一个字符串输入: invest_#_1945_#_TRADE

基本上我正在寻找构建一个扫描定义的函数,并让我回到与之相关的单词。 输入要在字典中搜索的单词输入:TRADE输出:在“投资”一词中找到“TREADE”

到目前为止,我设法使用strtok()函数,但是现在我不知道如何处理打印第一个单词。

这是我能想到的:

  char split(char words[99],char *p) { p=strtok(words, "_#_"); while (p!=NULL) { printf("%s\n",p); p = strtok(NULL, "_#_"); } return 0; } int main() { char hello[99]; char *s = NULL; printf("Enter a string you want to split\n"); scanf("%s", hello); split(hello,s); return 0; } 

关于我该怎么做的任何想法?

我认为你的问题是如何从格式化的字符串中提取三位信息。

函数strtok不能像你想象的那样工作:第二个参数不是文字分隔字符串,而是一个字符串,用作一组分隔符的字符。

在你的情况下, sscanf似乎是更好的选择:

 #include  #include  int main() { const char *line = "invest_#_1945 _#_TRADE "; char word[40]; int year; char def[40]; int n; n = sscanf(line, "%40[^_]_#_%d_#_%40s", word, &year, def); if (n == 3) { printf("word: %s\n", word); printf("year: %d\n", year); printf("def'n: %s\n", def); } else { printf("Unrecognized line.\n"); } return 0; } 

函数sscanf根据给定的模式检查给定的字符串。 粗略地说,该模式由以百分号开头的格式说明符组成,空格表示任意数量的空白字符(包括无),以及必须与varbatim匹配的其他字符。 格式说明符产生一个必须存储的结果。 因此,对于每个说明符,必须在格式字符串后面给出结果变量。

在这种情况下,有几个块:

%40[^_]最多可读取40个不是char数组下划线的字符。 这是读取字符串的特例。 sscanf中的字符串实际上是单词,可能不包含空格。 但是,下划线是字符串的一部分,所以为了不占用第一个分隔符的下划线,你必须使用符号[^(chars)] ,这意味着:任何不包含的字符序列给定的字符。 (插入符号在这里做出否定, [(chars)]意味着给定字符的任何序列。)

_#_按字面_#_匹配第一个分隔符,即仅当下一个字符是下划线哈希标记,下划线时。

%d将十进制数读入整数。 请注意,必须在此处使用&给出整数的地址。

_#_匹配第二个分隔符。

%40s将最多40个非空白字符的字符串读入char数组。

该函数返回匹配结果的数量,如果该行有效,则应为3。 函数sscanf可能很麻烦,但对于快速和脏的输入,这可能是你最好的选择。

 #include  #include  char *strtokByWord_r(char *str, const char *word, char **store){ char *p, *ret; if(str != NULL){ *store = str; } if(*store == NULL) return NULL; p = strstr(ret=*store, word); if(p){ *p='\0'; *store = p + strlen(word); } else { *store = NULL; } return ret; } char *strtokByWord(char *str, const char *word){ static char *store = NULL; return strtokByWord_r(str, word, &store); } int main(){ char input[]="invest_#_1945_#_TRADE"; char *array[3]; char *p; int i, size = sizeof(array)/sizeof(char*); for(i=0, p=input;i