c - 使用 strtok 吐出数组并将标记存储在唯一的以 null 结尾的字符串中

标签 c strtok

我有一个字符串数组 cmd,其容量为 255 个字符,这样声明:

char cmd[255];

我使用 fgets 以这种方式获取用户输入:

fgets(cmd, 256, stdin);

我有三个单独的数组来存储三个标记(假设用户仅输入最多包含 2 个空格的字符串),以这种方式声明:

char arg[20];
char arg2[20];
char arg3[20];

我用 strtok 这样在 cmd 中分割字符串:

char *p = strtok(cmd, " ");

while (p!= NULL) {

// I want to store the tokens p in the arrays here (e.g:
// arg = p is not working
// arg2 = p ...

p = strtok(NULL, " ");
}

以这种方式为指针赋值是行不通的。我可以得到一些关于该怎么做的帮助吗?

我必须将 token 存储在以 null 结尾的字符串中

最佳答案

像这样:

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

#define ARG_LEN 20

int main(void){
    char cmd[256];

    if(fgets(cmd, sizeof cmd, stdin)){
        char arg[ARG_LEN+1], arg2[ARG_LEN+1], arg3[ARG_LEN+1];
        char *args[] = { arg, arg2, arg3, NULL };
        char **pp = args;
        const char *delimiter = " \t\n";//Include \n

        for(char *p = strtok(cmd, delimiter); p && *pp; p = strtok(NULL, delimiter)){
            strncpy(*pp, p, ARG_LEN);
            (*pp++)[ARG_LEN] = 0;//Cut it if it is too long
        }
        for(size_t i = 0; args + i < pp; ++i){
            printf("argument #%zu: '%s'\n", i+1, args[i]);
        }
    }
}
<小时/>

sscanf 版本。

#include <stdio.h>

//Stringification
#define S_(n) #n
#define S(n) S_(n)

#define FMT "%" S(ARG_LEN) "s"

#define ARG_LEN 20

int main(void){
    char cmd[256];

    if(fgets(cmd, sizeof cmd, stdin)){
        char arg[ARG_LEN+1], arg2[ARG_LEN+1], arg3[ARG_LEN+1];
        char *args[] = { arg, arg2, arg3 };
        int ret_scnf = sscanf(cmd, FMT FMT FMT, arg, arg2, arg3);
        for(int i = 0; i < ret_scnf; ++i){
            printf("argument #%i: '%s'\n", i+1, args[i]);
        }
    }
}

关于c - 使用 strtok 吐出数组并将标记存储在唯一的以 null 结尾的字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43728469/

相关文章:

c - 如何读取 "int (*functionFactory(int n))(int, int) { ... }"?

c - strtok 给出空字符串或我不知道的东西

c - 访问在指向 strtok 的字符数组的指针中传递的变量时获取不正确的值

c++ - 移动 strchr 指针后使用 strtok

c - 为什么 strtok_r 总是找到模式 "."?

c - 从c中的 token 中获取一些字符串

c - C 中的 Zip 动态压缩库用于流式传输

c - 使用 do 循环和函数来制作菜单。 C

c - 这是正确的吗? (在 C 中读入文件)

c - K&R 练习 1.16 - 线长限制