-1

我正在编写一个 C 程序,用户可以输入一串 1-3 位数字,后跟反斜杠,然后再输入 1-3 位数字,或者他们可以输入 1-3 位数字,后跟逗号,然后再输入 1-3 位数字他们可以迭代多少次没有限制。

我需要确定输入分隔符是反斜杠还是逗号(以确定如何处理数字)并将数字放入数组中。

我正在考虑这样做的方式是使用 strtok 如下。字符串作为 char *token 输入。

op_tok1 = strtok(token, "\\");
if(op_tok1 != NULL)
{
        /* Process numbers */
        return;
}

op_tok2 = strtok(token, ",");
if(op_tok2 != NULL)
{
    /* Process other numbers */
    return;
}

这适用于以反斜杠分隔的任何内容,但不适用于逗号。我相信这是因为 strtok 与 token 变量混淆了。这是真的?有没有更好的方法来解决这个问题?谢谢!

4

3 回答 3

2

当然,我会考虑更好的方法。如果您可以相当好地依赖输入的格式(即,实际上是三位数字后跟一个允许的分隔符),您可以执行以下操作:

char *pos = 0;

while (2 == sscanf(input+pos, "%d%c", &number, &delimiter)) {
    if ('\\' == delimiter)
        process_backslash(number);
    else if (',' == delimiter)
        process_comma(number);
    else
        error_invalid_delimiter(delimiter);
    pos += 4;
}
于 2012-04-27T21:56:48.883 回答
0

其他人已经发布了更好的解决方案 - strtok 并不真正适合这项任务。然而,回答第一个问题 - 是 strtok 改变底层字符串,是的(在我看来它是如何工作的很邪恶。许多年轻球员都陷入了这个陷阱):

strtok将 token 替换为\0(Null terminator) 并传递字符串的开头。后续调用strtok(NULL, <token>)继续扫描字符串,寻找下一个标记,不需要相同。

因此你可以这样做:

op_tok1 = strtok(token, "\\");
if(op_tok1 != NULL)
{
    /* Process numbers */
    return;
}

op_tok2 = strtok(NULL, ",");
if(op_tok2 != NULL)
{
   /* Process other numbers */
   return;
}

还要注意它不是线程安全的。

于 2012-04-28T00:01:41.040 回答
0

为什么不直接使用scanf()

~/tmp$ cat test.c
#include <stdio.h>
int main(int argc, char ** argv) {
    int i;
    char c;
    while (2 == scanf("%d%[\\.]",&i,&c)) {
        printf("Int %d\nChar %c\n", i, c);
    }
}

...为我工作。

~/tmp$ gcc test.c && echo "123.456\789.4" | ./a.out
Int 123
Char .
Int 456
Char \
Int 789
Char .
~/tmp$
于 2012-04-28T00:59:08.000 回答