2013-03-24 70 views
-1

我想打一個功能,包含由空格分隔(無符號)的整數值,給出字符串給我值的數量在字符串中算多少整數值是一個給定的字符串中

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

此功能不會給我正確的編號。誰能幫我?

+0

你能提供的電話嗎? – md5 2013-03-24 18:16:49

+0

除了@Kirilenko請求之外,你作爲'args'傳遞了什麼值,你的函數返回了什麼? – adamdunson 2013-03-24 18:21:07

回答

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[] = ""; 
    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(由一個或多個非數字分隔)出現在給定的字符串')中。但是原始代碼也可能因爲類似的理由而受到批評:它計數連續非空白序列的數量,這些序列由一個或多個空格分隔,出現在給定的字符串中。您可以改進實現,但要小心如何處理錯誤格式化的數據並報告問題。

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 
+0

爲什麼不添加測試代碼?它不需要複雜或徹底;只是足以顯示它對一些示例數據的期望。 – 2013-03-24 18:48:04

+0

@JonathanLeffler,我確定 – maverik 2013-03-24 19:05:39