gpt4 book ai didi

c - 将 String 解析为 C 中的标记 - 出了什么问题?

转载 作者:太空宇宙 更新时间:2023-11-04 01:52:36 26 4
gpt4 key购买 nike

我正在尝试将字符串拆分为标记以创建参数数组。我当前的实现如下(path 是正在读取可选参数的用户可执行文件的路径):

// ARG_MAX as defined in limits.h
int execute(char *exe) {
printf("args to %s: ", exe);

char *args = malloc(ARG_MAX);
scanf("%s", args);

char *argv[ARG_MAX];

int i = 0;
argv[i++] = exe;

while ((argv[i] = strsep(&args, " \t")) != NULL) {
i++;
}

free(args);
execv(exe, argv);
return 0;
}

让我感到困惑的是,根据我对 strsep 的理解,它应该可以按预期工作,并且在一定程度上确实如此,因为在测试时它准确地分配了 tokens[0]pathtokens[1] 是第一个空白字符之前的任何 tokens_s

但是,当您在空格后输入另一个参数时,它不会分配到 tokens[2] 中,后续参数依此类推。

我似乎无法发现我在使用未实现所需功能的 strsep 时做错了什么?

输入:exe = "/usr/bin/ps"args = "-e -l"

输出:执行 ps -e

最佳答案

多个错误:

  • 您必须使用 fgets() 读取参数才能读取多个单词。

  • 您必须为 strsep() 使用一个临时变量,这样您就可以将原始指针从 malloc() 传回给 free(),或者简单地使用本地数组。

这是更正后的版本:

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>

// ARG_MAX as defined in limits.h
int execute(char *exe) {
char args[ARG_MAX + 1];

printf("args to %s: ", exe);
fflush(stdout);
if (fgets(args, sizeof args, stdin)) {
char *argv[ARG_MAX / 2];
char *p;

int i = 0;
argv[i++] = exe;

p = args;
args[strcspn(args, "\n")] = '\0'; // strip the newline if present
while ((argv[i] = strsep(&p, " \t")) != NULL) {
i++;
}

printf("argv: ");
for (i = 0; argv[i]; i++)
printf(" '%s'", argv[i]);
printf("\n");

execv(exe, argv);
printf("exec failed: %s\n", strerror(errno));
} else {
printf("cannot read input\n");
}
return 0;
}

int main(int argc, char *argv[]) {
char *exe = "printf";
if (argc > 1)
exe = argv[1];
return execute(exe);
}

注意事项:

  • execv 如果成功则不会返回到您的程序。

  • strsep 不会折叠分隔符序列,如果您有额外的空格,您的方法将创建额外的参数。

编辑:如果在您开始运行execute 之前从stdin 读取输入,并且如果此类输入是通过调用 执行的>scanf()stdin 缓冲区中可能有待处理的换行符,fgets() 会将其读取为空行。如果是这种情况,请在调用 printf() 之前先刷新挂起的输入:

int c;
while ((c = getchar()) != EOF && c != '\n') {
continue;
}

关于c - 将 String 解析为 C 中的标记 - 出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40619971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com