【发布时间】:2010-04-22 23:00:34
【问题描述】:
我有一个格式为“ABCDEFG,12:34:56:78:90:11”的字符串。我想将这两个用逗号分隔的值分隔成两个不同的字符串。我如何使用 c 语言在 gcc 中做到这一点。
【问题讨论】:
-
不清楚你需要什么样的语法检查。你只是想做CSV吗?第一个字符必须是大写的吗?
我有一个格式为“ABCDEFG,12:34:56:78:90:11”的字符串。我想将这两个用逗号分隔的值分隔成两个不同的字符串。我如何使用 c 语言在 gcc 中做到这一点。
【问题讨论】:
一种可能性是这样的:
char first[20], second[20];
scanf("%19[^,], %19[^\n]", first, second);
【讨论】:
这么多人建议strtok...为什么? strtok 是石器时代编程的遗留物,仅适用于 20 行实用程序!
对 strtok 的每次调用都会通过在该调用返回的标记后插入一个空字符来修改 strToken。 [...] [F]unction 使用静态变量将字符串解析为标记。 [...] 对该函数的交错调用极有可能产生数据损坏和不准确的结果。
scanf,就像 Jerry Coffin 的 answer 一样,是一个更好的选择。或者,您可以手动完成:找到带有strchr 的分隔符,然后将部分复制到单独的缓冲区中。
【讨论】:
char str[] = "ABCDEFG,12:34:56:78:90:11"; //[1]
char *first = strtok(str, ","); //[2]
char *second = strtok(NULL, ""); //[3]
[1] ABCDEFG,12:34:56:78:90:11
[2] ABCDEFG\012:34:56:78:90:11
逗号替换为空字符,第一个指向“A”
[3] 对 `strtok` 的后续调用将 NULL` 作为第一个参数。
您可以更改分隔符。
注意:你不能使用“字符串文字”,因为 `strtok` 修改了字符串。
【讨论】:
strtok("ABCD,etc.", ",") -- 即将字符串文字传递给strtok。 strtok 通过修改原始字符串来工作——它将分隔符 (',') 替换为空字符。这是我什至不向我的敌人推荐strtok 的原因之一:)。 (第二个原因是它保持全局状态,因此不能重入,也不能是线程安全的)。
strtok 对我来说似乎是个不错的选择。
char *second = strtok(NULL, ""); 以获取字符串的其余部分。
您可以使用strtok,它允许您指定分隔符并为您生成令牌。
【讨论】:
你可以使用 strtok:
来自cppreference.com的示例:
char str[] = "now # is the time for all # good men to come to the # aid of their country";
char delims[] = "#";
char *result = NULL;
result = strtok( str, delims );
while( result != NULL ) {
printf( "result is \"%s\"\n", result );
result = strtok( NULL, delims );
}
【讨论】:
尝试使用以下正则表达式,它会找到任何带有字符 a-z A-Z 后跟“,”的内容
"[A-Z]," 如果您也需要小写字母,请尝试 "[a-zA-Z],"
如果您需要它先搜索第二部分,您可以尝试以下方法
",[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}: [0-9]{2}"
有一个关于如何使用正则表达式的例子 http://ddj.com/184404797
谢谢, V$h3r
【讨论】: