【问题标题】:use of strsep in C while parsing argv Variable doesen't work在解析 argv 变量时在 C 中使用 strsep 不起作用
【发布时间】:2012-05-02 20:18:47
【问题描述】:

我在解析 argv 变量时遇到了 C 语言问题。这是任务:

我从命令行获取了一些参数到我的 C 程序中。其中一个看起来像“-r=20-5”。在那里我必须找到“r”。这适用于:

if (argv[i][0] != 0 && argv[i][1] != 0 && argv[i][2] != 0 &&
    argv[i][0] == '-' && argv[i][2] == '=') { /* Check the Variables */
    switch (argv[i][1]) {
        case 'r':
            /* what have to be here? */
            break;
}

现在我有了“r”。但我也需要两个不同变量中的 20 和 5。这是我的想法,但它没有用。我尝试了

strsep(argv[i]+3, "-");

但我的编译器 (Xcode) 会引发警告(警告:从不兼容的指针类型传递 'strsep' 的参数 1)

有没有人知道(或链接)我如何解决这个问题?


解决后仍然有警告,所以我得到答复以发布我的整个新代码:


int parse(int argc, const char *argv[]) {
    int i, x, y;
    int intTmp;
    long longTmp;
    char *strTmp;
    char *end;

    for (i = 1; i < argc; i++) {
        /* check for (-?=) */
        if (argv[i][0] != 0 && argv[i][1] != 0 && argv[i][2] != 0 &&
            argv[i][0] == '-' && argv[i][2] == '=') {

            /* IGNORE THIS
             * longTmp = strtol(argv[i]+3, &end, 10);
             * intTmp = analyseEndptr(longTmp, argv[i]+3, end);
             */

            switch (argv[i][1]) {
                case 'r':
                    strTmp = argv[i]+3;                 /* <= Here I got the warning */
                    x = atoi(strsep(&strTmp, "-"));
                    y = atoi(strsep(&strTmp, "-"));
                    printf("x=%d, y=%d\n", x, y);
                    break;
            }
        }
    }
}

警告是:警告:从不兼容的指针类型传递 'strsep' 的参数 1

我的编译器是:gcc on MacOS using XCode as IDE

【问题讨论】:

  • strsepchar ** 作为其第一个参数,而不是char *
  • 或者您可以编写自己的解析器。这将需要一些时间,但它会按您的意愿工作。您需要做的只是遍历字符串。作为分隔符,您可以使用“-”符号。
  • @Paul R 如何从 char* 中获取 char**? (我很快用谷歌搜索,但没有好的结果)

标签: c string parsing strtok strsep


【解决方案1】:

你知道 sscanf 吗?看看:

  unsigned a,b;
  if( 2==sscanf(argv[i],"-r=%u-%u",&a,&b) )
    printf("%u-%u",a,b);

【讨论】:

  • 那个比other one简单得多。无论如何,另一个也可以。
【解决方案2】:

这是您将字符串传递给strsep()的方法

    switch (argv[i][1]) {
        char *s;
        int x, y;
        case 'r':
            s = argv[i] + 3;
            x = atoi(strsep(&s, "-"));
            y = atoi(strsep(&s, "-"));
            printf("x=%d, y=%d\n", x, y);
            break;
    }

将产生:

x=3, y=4

不要按原样使用它。您必须根据您的情况对xy 进行额外的NULLchecks。

【讨论】:

  • 酷。那行得通,但我仍然收到警告。为什么? (警告不好)
猜你喜欢
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2018-01-12
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
相关资源
最近更新 更多