Каким образом он не даст вам правильный номер? Вот ваш код, встроенный в 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
Обратите внимание, что одна законная критика в этом заключается в том, что она не требует, чтобы целые числа были разделены пробелами (поэтому более точная характеристика этого «подсчитывает количество последовательностей одного или нескольких смежных digi ts (разделенные одной или несколькими цифрами) отображаются в заданной строке '). Но исходный код также может быть подвергнут критике по аналогичным причинам: он подсчитывает количество последовательностей последовательных не-пробелов, разделенных одной или несколькими пробелами, появляется в данной строке. Вы можете уточнить реализацию, но будьте осторожны с тем, как вы обрабатываете ошибочно отформатированные данные и сообщаете о проблемах.
Не могли бы вы предоставить вызов? – md5
В дополнение к тому, что просил @ Кириленко, какое значение вы передаете как 'args' и какова ваша функция? – adamdunson