以什么方式不会给你正确的号码?这里是你的代码嵌入到SSCCE(Short, Self-Contained, Correct Example)。
#include <string.h>
#include <stdio.h>
extern int conta_coords(char *str);
int conta_coords(char *args) {
char *pal;
int k=0;
pal = strtok (args," ");
while (pal != NULL)
{
k++;
pal =strtok (NULL," ");
}
return k;
}
int main(void)
{
char data[] = "1 23 456 7890 12345";
printf("Data: %s\n", data);
printf("Number: %d\n", conta_coords(data));
printf("Data split: %s\n", data);
return 0;
}
输出:
$ ./cntnum
Data: 1 23 456 7890 12345
Number: 5
Data split: 1
$
这看起来正确的给我。但请注意,原始字符串已被切成碎片。另外,如果我传递了一个只读字符串(字符串文字),我可能会得到不同的结果,因为strtok()
会修改它所处理的数据,但字符串文字不总是可修改的(并且您可能会得到一个核心转储试图修改它)。例如:
printf("Number: %d\n", conta_coords(" 1 23 45 67 99 "));
这给了我一个'总线错误'(如果它们没有被禁用,它会给出一个核心转储)。
这里有一个替代实现,通过不修改搜索字符串的所有,使用备受低估C89标准功能strspn()
和strcspn()
对常量字符串的工作原理:
#include <string.h>
#include <stdio.h>
extern int conta_coords(const char *str);
int conta_coords(const char *str)
{
const char digits[] = "";
const char *ptr = str;
int k = 0;
int n = strcspn(ptr, digits);
while (ptr[n] != '\0')
{
ptr += n;
n = strspn(ptr, digits);
if (n > 0)
k++;
ptr += n;
n = strcspn(ptr, digits);
}
return k;
}
int main(void)
{
char data[] = "1 23 456 7890 12345";
printf("Data: %s\n", data);
printf("Number: %d\n", conta_coords(data));
printf("Data unsplit: %s\n", data);
printf("Number: %d\n", conta_coords(" 1 23 45 67 99 "));
return 0;
}
输出:
Data: 1 23 456 7890 12345
Number: 5
Data unsplit: 1 23 456 7890 12345
Number: 5
请注意,对此的一个合理批评是,它并不要求整数由空格分开(所以更准确地表征它是“计算一个或多个连续数字的多少个序列ts(由一个或多个非数字分隔)出现在给定的字符串')中。但是原始代码也可能因为类似的理由而受到批评:它计数连续非空白序列的数量,这些序列由一个或多个空格分隔,出现在给定的字符串中。您可以改进实现,但要小心如何处理错误格式化的数据并报告问题。
你能提供的电话吗? – md5 2013-03-24 18:16:49
除了@Kirilenko请求之外,你作为'args'传递了什么值,你的函数返回了什么? – adamdunson 2013-03-24 18:21:07