优化这段代码int fun(char *s) { int count = 0; while (*s != '\0') { if (*s >= '0' && *s <= '9') { count++; } s++; } return count;}
时间: 2024-03-07 18:46:35 浏览: 92
这段代码本身并不复杂,但是可以进行一些小优化:
1. 将条件判断中的 `'0'` 和 `'9'` 直接替换为对应的 ASCII 值,即 `48` 和 `57`,可以减少运算开销。
2. 将 `*s` 的值存储在一个变量中,可以避免重复访问内存。
3. 可以使用 `for` 循环代替 `while` 循环,让代码更加简洁。
优化后的代码如下:
```
int fun(char *s) {
int count = 0;
for (char c = *s; c != '\0'; c = *(++s)) {
if (c >= 48 && c <= 57) {
count++;
}
}
return count;
}
```
这个优化后的版本中,我们用 `c` 存储了 `*s` 的值,然后使用 `for` 循环遍历字符串,每次循环都将 `s` 指向下一个字符。这个版本的代码更简洁、更易读、更高效。
相关问题
char *fun ( char *s, char *t) { /**********Program**********/ int i=0,count1=0,count2=0; while(s[i]!='\0') { count1++; } i=0; while(t[i]!='\0') { count2++; } if(count1<count2)return t; return s; /********** End **********/ }这串代码比较字符串的长度有问题吗
这段代码比较字符串长度有问题,因为在计算字符串长度时,虽然使用了循环来遍历字符串,但是没有对循环变量 `i` 进行自增操作,导致程序无法终止,会一直死循环下去。
正确的代码应该是这样的:
```
char *fun(char *s, char *t) {
int count1 = 0, count2 = 0;
while (s[count1] != '\0') {
count1++;
}
while (t[count2] != '\0') {
count2++;
}
if (count1 < count2) {
return t;
}
return s;
}
```
这里使用了数组下标来遍历字符串,同时在循环中对计数器变量进行自增操作,避免了死循环的问题。
优化void fun(char *s, int *a, int *b) { *a = 0;大写字母个数初始化为0 *b = 0;小写字母个数初始化为0 while (*s != '\0') { // 遍历字符串 if (*s >= 'A' && *s <= 'Z') { (*a)++;大写字母个数加1 } else if (*s >= 'a' && *s <= 'z') { (*b)++;小写字母个数加1 } S++;指针后移 } }
这段代码的功能是统计字符串中大写字母和小写字母的个数,并将结果分别保存在传入的指针变量*a和*b中。
关于优化,这段代码已经比较简洁高效了,不过有几点可以注意一下:
1. 函数名不太规范,可以改成更有意义的名字,比如count_upper_lower。
2. 函数参数可以使用const关键字,表示不会修改输入的字符串。
3. 对于判断字符是否为大写字母和小写字母的if语句,可以使用ctype.h头文件中的函数isupper和islower来替代,使代码更加清晰简洁。
下面是优化后的代码:
```c
#include <ctype.h>
void count_upper_lower(const char *s, int *upper, int *lower) {
*upper = 0; // 大写字母个数初始化为0
*lower = 0; // 小写字母个数初始化为0
while (*s != '\0') { // 遍历字符串
if (isupper(*s)) { // 判断是否为大写字母
(*upper)++; // 大写字母个数加1
} else if (islower(*s)) { // 判断是否为小写字母
(*lower)++; // 小写字母个数加1
}
s++; // 指针后移
}
}
```
注意到我们去掉了if语句中对字符范围的判断,改成了使用isupper和islower函数,代码更加简洁易懂。另外,我们使用了const关键字来表示输入字符串不会被修改,这样可以避免一些不必要的错误。
阅读全文