2011-05-14 51 views
0

我编写函数计算字符串中的数字。 示例: “t5ds5” 程序返回10 = 5 + 5。 我运行我的程序时出错。 这里的代码!函数计算字符串中的数字

int SumStr(char *str) 
{ 
    int i; 
    int temp = 0; 
    for(i=0;i<strlen(str);i++) 
    { 
     if(*str >= 48 && *str <= 57) 
     { 
      temp +=*str; 
     } 
    } 
    printf("%d", temp); 
    return 0; 
} 
+2

你会得到什么错误? – 2011-05-14 18:16:44

+0

在strlen函数中出现访问冲突错误。 – Wl7a 2011-05-14 18:18:37

+2

最好使用['isdigit()'](http://linux.die.net/man/3/isdigit)来检查数字字符。 – 2011-05-14 18:19:11

回答

2

您不会将指针移动到字符串,因此您只会检查第一个值,而不会检查其他任何值。您还需要从ascii值向下移到整数值。它应该是这样的:

if (str[i] >= 48 && str[i] <= 57) { 
    temp += str[i] - '0'; 
} 
+0

仍然有错误 – Wl7a 2011-05-14 18:25:10

2

试试这个:

int SumStr(char *str) 
{ 
    int temp = 0; 
    while(*str) 
    { 
     if((*str >= '0') && (*str <= '9')) 
      temp += *str - '0'; 
     str++; 
    } 
    printf("%d", temp); 
    return 0; 
} 

虽然这会显得更加正常:

int SumStr(char *str) 
{ 
    int result = 0; 
    while(*str) 
    { 
     if((*str >= '0') && (*str <= '9')) 
      temp += *str - '0'; 
     str++; 
    } 
    return result; 
} 

调用与SumStr("t5ds5")功能给出了10

预期的结果

您的代码没有前进str因此您检查了每次循环都有相同的字符。它也每次调用strlen()这个循环使得算法O(n^2)不理想。根据上面的代码,你可能会走一次字符串。

至于为什么你的代码产生的访问冲突必须是由于你没有显示的代码部分。人们只能想象str必须指向一个无效的内存地址或不是空终止。

+0

不工作的家伙,我写我的更新代码.. – Wl7a 2011-05-14 18:33:09

+0

@ Wl7a对不起,我错误地增加了循环内的str。它现在有效。 – 2011-05-14 18:34:57

+0

仍然不工作): – Wl7a 2011-05-14 19:15:23