如何获取输入的第二个字符串

时间:2017-01-18 02:32:52

标签: c

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

int main(void) {

    char command[256];
    char *token;
    const char s[2] = " ";

    fprintf(stdout, "$ Please enter a command \n");
    fflush( stdout );

    fgets ( command, 256, stdin );
    token = strtok(command, s);

    if (strcmp(token, "loaddungeon") == 0){
        fprintf(stdout, "$ loaded successfully \n");
        fflush( stdout );
    }
}

我正在尝试使用strtok来获取输入的第二个字符串。例如,如果输入为“loaddungeon dfile.txt”,我想要的是“dfile.txt”。我的函数能够获得字符串“loaddungeon”。但我不知道如何获得第二个字符串“dfile.txt”。谁能告诉我怎么做?

(考虑输入始终为“loaddungeon dfile.txt”。)

2 个答案:

答案 0 :(得分:1)

strtok的每次调用都将返回指向给定字符串中找到的最后一个标记的指针(如果没有,则返回null)。要使用空格作为分隔符检索第二个标记,您需要第二次调用strtok

int main()
{
    char command[256];
    char *token1 = NULL;
    char *token2 = NULL;
    const char s[2] = " ";
    fprintf(stdout, "$ Please enter a command \n");
    fflush(stdout);
    fgets(command, 256, stdin);
    token1 = strtok(command, s); // now points to first word
    if (NULL != token1) {
        token2 = strtok(NULL, s); // now points to second word
    }
    if (NULL != token2) {
        if (strcmp(token2, "loaddungeon") == 0){
           fprintf(stdout, "$ loaded successfully \n");
           fflush(stdout);
        }
    }
}

答案 1 :(得分:1)

要阅读第二个字符串,您需要将NULL传递给strtok()。请注意,fgets()会保留输入行中的换行符,因此您应将分隔符定义从char s[2] = " ";更改为char s[] = " \r\n";char s* = " \r\n"。这样,第二个令牌将不包含任何换行符。另请注意,如果未找到令牌,strtok()将返回NULL指针,因此下面的代码会在打印读取令牌之前对此进行测试。

但是,既然你说只有两个字符串,我会考虑只使用sscanf()。使用%s转换说明符,sscanf()会将字符读入字符串,直到遇到空白字符,但不会在字符串中包含此空白字符。在%s类型函数中使用scanf()说明符时,应指定最大字段宽度以避免缓冲区溢出。此最大宽度应小于缓冲区的大小,以便为'\0'字符串终止符留出空间,在这种情况下 255 sscanf()函数返回成功分配的数量,在这种情况下应为 2 。下面显示的sscanf()方法(已注释掉)会在打印字符串之前检查此返回值。

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

#define BUFFER_MAX  256

int main(void) {

    char command[BUFFER_MAX];
    char *token1 = NULL;
    char *token2 = NULL;
    const char *s = " \r\n";

    fprintf(stdout, "$ Please enter a command \n");
    fflush( stdout );

    fgets ( command, BUFFER_MAX, stdin );

    token1 = strtok(command, s);
    token2 = strtok(NULL, s);

    if (token1 && token2 && strcmp(token1, "loaddungeon") == 0) {
        fprintf(stdout, "$ loaded successfully: %s\n", token2);
        fflush( stdout );
    }

    /* or instead do this */
/*
    char word1[BUFFER_MAX], word2[BUFFER_MAX];
    if (sscanf(command, "%255s %255s", word1, word2) == 2) {
        if (strcmp(word1, "loaddungeon") == 0){
            fprintf(stdout, "$ loaded successfully: %s\n", word2);
            fflush( stdout );
        }
    }
*/
    return 0;
}