Strtok使用并找到第二个元素

时间:2014-03-04 21:28:25

标签: c strtok

我正在编写一个程序,要求用户输入两个单词,用逗号分隔。我还必须编写一个函数来查找字符串中的第二个单词,并将该单词复制到一个新的内存位置(不带逗号)。该函数应返回指向新内存位置的指针。然后Main应打印原始输入字符串和第二个单词。

到目前为止,这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char*secondWordFinder(char *userInput)

int main ()

{

        char*userInput;
        char*result;

        userInput=malloc(sizeof(char)*101);

        printf("Please Enter Two Words Separated by a comma\n");
        fgets(userInput,101, stdin);

        printf("%s",userInput);

        result=secondWordFinder(userInput);
        printf("%s",result);

        free(userInput);

        return 0;
}

    char*secondWordFinder(char *userInput)

    {
        char*userEntry;
        char*ptr;
        int i;
        i=0;

        for(i=0; i<strlen(userInput);i++)
        {
            userEntry=strtok(userInput, ",");
            userEntry=strtok(NULL,",");
            pointer=strcpy(ptr,userEntry);
        }
        return ptr;
    }

我没有在这里得到一个实际输出代码我做错了什么???

2 个答案:

答案 0 :(得分:0)

提取第二个令牌时,您说它必须后面跟一个逗号。

userEntry = strtok(NULL, ",");

但实际上后面是换行符。试试这个:

userEntry = strtok(NULL, ",\n");

如果第二个单词是最后一个单词,则会有效,如果后面跟着另外的逗号分隔单词,则会有效。

是的,你可以扔掉循环。

答案 1 :(得分:0)

几个问题:

    for(i=0; i<strlen(userInput);i++)
    {
        userEntry=strtok(userInput, ",");
        userEntry=strtok(NULL,",");
        pointer=strcpy(ptr,userEntry);
    }
  • 你正在为输入字符串中的每个字符重复这些操作,这没有意义 - 这根本不需要在循环中;
  • 您尚未初始化ptr指向任何有意义的位置,因此您尝试将userEntry复制到一些随机内存块中;
  • 第二次致电strtok后,userEntry已经指向第二个字符串 - 您只需返回userEntry

您应该可以将其重写为

strtok(userInput, ", "); // accounts for any spaces between the comma and next string
userEntry = strtok( NULL, ", ");
return userEntry;

您可能希望在返回之前从第二个单词(如果存在)中删除尾随换行符;一种方法是

char *newline = strchr( userEntry, '\n' );
if ( newline )
  *newline = 0;

修改

如果要求你必须将第二个单词复制到secondWordFinder中的新缓冲区并将指针返回到新缓冲区,那么你必须按照

的方式做一些事情。
ptr = malloc( strlen( userEntry ) + 1 );
if ( ptr )
  strcpy( ptr, userEntry );

return ptr;