计算由空格分隔的整数值在给定字符串中的数量

时间:2013-03-24 18:14:52

标签: c arrays size

我想创建一个函数,给定包含由空格分隔的(无符号)整数值的字符串,给出字符串中值的数量:

int conta_coords(char *args) {
  char *pal;
  int k=0;
  pal = strtok (args," ");
  while (pal != NULL)
  {
      k++;
      pal =strtok (NULL," ");
  }
  return k;
}

此功能不会给我正确的号码。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

它会以什么方式给你正确的号码?这是您的代码嵌入到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)出现在给定的字符串')中。但是原始代码也可以基于类似的理由受到批评:它计算连续非空白的序列数,由一个或多个空格分隔,出现在给定的字符串中。您可以优化实现,但要警惕如何处理错误格式化的数据并报告问题。

答案 1 :(得分:1)

类似的东西:

#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

bool is_stringified_num(const char *str, const size_t size)
{
    int n = 0;
    while(n < size && isdigit(str[n++]));

    return n == size;
}

int str_numbers_count(char *str)
{
    int numbers_count = 0;
    char *prev_pos = str;
    char *pos = strchr(str, ' ');

    while(pos)
    {
        if (is_stringified_num(prev_pos, pos - prev_pos)) ++numbers_count ;
        prev_pos = ++pos;
        pos = strchr(pos, ' ');
    }

    if (is_stringified_num(prev_pos, strlen(str) - (prev_pos - str))) ++numbers_count ;

    return numbers_count ;
}

int main(int argc, char *argv[])
{
    char str[] = "1 23 456 7890 12345";
    printf("%s contains %d numbers\n", str, str_numbers_count(str));

    return 0;
}

Ideone编译好并输出:

1 23 456 7890 12345 contains 5 numbers