我想创建一个函数,给定包含由空格分隔的(无符号)整数值的字符串,给出字符串中值的数量:
int conta_coords(char *args) {
char *pal;
int k=0;
pal = strtok (args," ");
while (pal != NULL)
{
k++;
pal =strtok (NULL," ");
}
return k;
}
这个函数不会给我正确的数字。谁能帮我吗?
最佳答案
在什么情况下它不会给你正确的号码?这是嵌入到 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[] = "0123456789";
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
请注意,对此的一个合理的批评是它不要求整数用空格分隔(因此更准确的描述是“计算一个或多个连续数字的序列(由一个或多个非数字分隔)” -digits) 出现在给定的字符串')中。但原始代码也可能因类似的原因受到批评:它计算给定字符串中出现的由一个或多个空格分隔的连续非空白序列的数量。您可以改进实现,但要注意如何处理格式错误的数据并报告问题。
关于计算给定字符串中有多少个由空格分隔的整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15602169/