strlen与pow易错点

本文通过两个实例深入探讨了C语言中使用strlen计算字符串长度及pow函数进行指数运算时可能遇到的问题,并给出了正确的解决方案。

string.h

  1. strlen()
    作用:返回字符数组的长度

错误例子:

#include <stdio.h>
#include <string.h>
#include <math.h>

int main(int argc, char const *argv[])
{
    char ch[20];
    ch[0] = '1', ch[1] = '1', ch[2] = '1';
    printf("strlen(ch) is %d\n",strlen(ch));
    return 0;
}

结果显示为:

似乎从这里看不出任何问题,但是如我我在加一个一个元素:
int main(int argc, char const *argv[])
{
    char ch[20];
    ch[0] = '1', ch[1] = '1', ch[2] = '1', ch[3] = '1';
    printf("strlen(ch) is %d\n",strlen(ch));
    return 0;
}

显示结果:

显然,字符数组只有4个元素,而调用strlen返回的结果却是7,这是不对,那原因是什么呢?

答案:
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。

而我们的数组ch并没有进行初始化,因此就可能会出现这样的问题。因此我们把代码进行修改:

int main(int argc, char const *argv[])
{
    char ch[20];
    ch[0] = '1', ch[1] = '1', ch[2] = '1', ch[3] = '1', ch[4] = '\0';
    printf("strlen(ch) is %d\n",strlen(ch));
    return 0;
}

运行结果:


math.h/cmath:

  1. pow()
    作用:求指数幂
    错误例子:
#include <stdio.h>
#include <math.h>

int main(int argc, char const *argv[])
{
    for (int i = 0; i < 5; i++)
    {
        int x = pow(10, i);
        printf("base is 10  expon is %d and result is %d\n", i, x);
    }
    return 0;
}

显示结果:

可以发现当指数为2和4的时候,他的精度出现了丢失,并且显示的结果很慢,事实上,原因如下:
     double pow (double base     , double exponent);
      float pow (float base      , float exponent);
long double pow (long double base, long double exponent);
     double pow (double base     , int exponent);
long double pow (long double base, int exponent);

可以看出,在C++98中,不论是输出还是输入,底数和返回值都不存在int类型(虽然在C++11中出现了重载选项,没试过不清楚),所以在用pow函数的时候,即使是对整数为底求整数次幂,也建议大家都用double类型。
修改一下,正确写法之一为下:

int main(int argc, char const *argv[])
{
    for (double i = 0; i < 5; i++)
    {
        double x = pow(10.0, i);
        printf("base is 10  expon is %lf and result is %lf\n", i, x);
    }
    return 0;
}
#include <stdio.h> #include <string.h> #include <stdlib.h> // 定义栈的最大容量 #define MAX_STACK_SIZE 100 // 栈结构 typedef struct { char data[MAX_STACK_SIZE]; int top; } Stack; // 初始化栈 void initStack(Stack *s) { s->top = -1; } // 判断栈是否为空 int isEmpty(Stack *s) { return s->top == -1; } // 入栈操作 void push(Stack *s, char c) { if (s->top < MAX_STACK_SIZE - 1) { s->data[++(s->top)] = c; } } // 出栈操作 char pop(Stack *s) { if (!isEmpty(s)) { return s->data[(s->top)--]; } return '\0'; } // 将字符转换为对应的数值 int charToInt(char c) { if (c >= '0' && c <= '9') { return c - '0'; } else if (c >= 'A' && c <= 'Z') { return c - 'A' + 10; } else if (c >= 'a' && c <= 'z') { return c - 'a' + 10; } return 0; } // 将数值转换为对应的字符 char intToChar(int num) { if (num >= 0 && num <= 9) { return num + '0'; } else { return num - 10 + 'A'; } } // 将任意进制字符串转换为十进制数 int toDecimal(const char *num, int sourceBase) { int decimal = 0; int power = 1; int len = strlen(num); for (int i = len - 1; i >= 0; --i) { decimal += charToInt(num[i]) * power; power *= sourceBase; } return decimal; } // 将十进制数转换为目标进制字符串 void fromDecimal(int decimal, int targetBase, char *result) { Stack s; initStack(&s); if (decimal == 0) { push(&s, '0'); } else { while (decimal > 0) { push(&s, intToChar(decimal % targetBase)); decimal /= targetBase; } } int i = 0; while (!isEmpty(&s)) { result[i++] = pop(&s); } result[i] = '\0'; } // 主函数,实现灵活数制转换 void convertBase(const char *num, int sourceBase, int targetBase, char *result) { int decimal = toDecimal(num, sourceBase); fromDecimal(decimal, targetBase, result); } int main() { char num[100]; int sourceBase, targetBase; char result[100]; printf("请输入要转换的数字: "); scanf("%s", num); printf("请输入源进制: "); scanf("%d", &sourceBase); printf("请输入目标进制: "); scanf("%d", &targetBase); convertBase(num, sourceBase, targetBase, result); printf("转换后的结果是: %s\n", result); return 0; } 他的一个逻辑思考简短,并给出易错及解决方法
10-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值