找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 261|回复: 3

字符长度的计算

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-8-15 14:14:09 | 显示全部楼层 |阅读模式
一般我们有自己的字符长度的计算的函数strlen()。这里我自己用函数实现了该功能。其中也有很大的收获。函数的模型是这样的:
int string_length(char *p)函数返回的就是计算后的字符的长度。
提示:这里我们一般用gets()或者是fgets()函数来实现的。

210

主题

371

回帖

0

积分

管理员

积分
0
 楼主| 发表于 2013-8-15 14:16:52 | 显示全部楼层
这里我用fgets()函数来实现该功能:
#include<stdio.h>
#define MAX 1024

int string_length(char *p)
{
    int count = 0;
   
    while(&#39;\0&#39; != *p)
    {
        if(&#39;\n&#39; != *p)
        {        
            p++;
            count++;
        }
        else
        {
            break;
        }
    }

    return count;
}

int main()
{
    char str[MAX];
    int length = 0;

    fgets(str, 1024, stdin);

    length = string_length(str);

    printf("the string&#39;s length is %d\n", length);
}

210

主题

371

回帖

0

积分

管理员

积分
0
 楼主| 发表于 2013-8-15 14:33:16 | 显示全部楼层
大家也可以用gets()函数来实现,但是我们在linux下编译的时候一般会有这样的警告:(.text+0x54): warning: the `gets&#39; function is dangerous and should not be used.
这是因为gcc编译器不支持这个函数,一般可用fgets代替。这里是因为gets()函数并没有限定输入的字符数目,这样我们在输入的时候很有可能输入的字符的长度超过定义的数组的大小,这样就有可能出现输入的字符超出给定的内存的不可预知的错误了。所以建议少用gets()函数或者在使用时,一定要注意定义的数组的大小。
但是同时会有另外一个问题出现了。gets()函数是遇到换行符时就在最后一个输入的字符那里加上一个&#39;\0&#39;做为结束符来代替换行符,而fgets()就不同了,它会在读取了换行符之后,在再换行符的后面加上‘\0’做为结束符,所以如果我们用此种方式计算字符串的长度的时候就会将换行符&#39;\n&#39;包括在内了。所以我们在写程序的过程中,可以自行的清除换行符&#39;\n&#39;来保证字符串的正确性。

205

主题

172

回帖

6921

积分

论坛元老

积分
6921
发表于 2013-8-15 17:27:10 | 显示全部楼层

回 tyrone2497谁 的帖子

tyrone2497谁:大家也可以用gets()函数来实现,但是我们在linux下编译的时候一般会有这样的警告:(.text+0x54): warning: the `gets&#39; function is dangerous and should not be used.
这是因为gcc编译器不支持这个函数,一般可用fgets代替。这里是因为gets()函数并没有限定输入的字符数目, ..&#160;(2013-08-15 14:33)&#160;
gets函数已经被C99标准废弃不用了,因为这个函数存在安全性问题。此外测试的时候关注函数的输入输出即可。主函数中传入给函数参数可以自己多写几个,利用assert函数写好单元测试用例。如:
assert(3 == my_strlen("abc"));
如果不成立将会直接异常退出,说明这条用例没通过。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 04:40 , Processed in 0.099817 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表