以什麼方式不會給你正確的號碼?這裏是你的代碼嵌入到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