C/C++知识点:C和C++字符串问题解析
小标 2018-07-25 来源 : 阅读 1190 评论 0

摘要:本文主要向大家介绍了C/C++知识点:C和C++字符串问题解析,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C/C++知识点:C和C++字符串问题解析,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

在C和C++中没有字符串变量,字符串通常都是用一个字符数组来存放的。

这一章的题目能够让我们更好的掌握对数组的运用。

一、不使用库函数将整数转换为字符串

#include <iostream>

 

using namespace std;

 

void change(int n, char *str)

{

    int temp;

    int i = 0;

    char buf[10] = "0";

    if(n < 0)

        temp = -n;  //如果输入的数是一个负数就将它转为整数

    else

        temp = n;

 

    if(str == NULL)    //判断传入的str是否有效

            return;

 

    while(temp != 0)

    {

        buf[i++] = temp % 10 + '0';  //将这个整数的每个位拆开,逆序放到buf中

        temp = temp / 10;

    }

     

    int j = 0;

    if(n < 0)     //如果是负数,就将str的第一个元素赋‘-’然后str向后移一个元素的长度

    {

        str[0] = '-';

        j++;

    }

 

    while(i > 0)

    {

        i--;

        str[j++] = buf[i];//将buf中的值再逆序放到str中。

    }

    str[j] = '\0'; //在最后一个元素后加上'\0'结尾

}

 

int main(int argc, char **argv)

{

    int num;

    char p[10];

    cout << "请输入一个整型数据: ";

    cin >> num;

    change(num, p);

    cout << "输出为: " << p << endl;

    return 0;

}</iostream>

   

二、不使用库函数将字符串转为数字 

#include <iostream>

 

using namespace std;

 

int strint(char const  *str);

 

int main(int argc, char **argv)

{

    char p[20] = "0";

    cout << "请输入一个字符串:";

    cin.getline(p, 20); //从终端获取一个字符串;

    int n;

    n = strint(p);

    cout << "输出: " << n << endl;

    return 0;

}

 

int strint(char const *str)

{

    int temp = 0;

    const char *ptr = str;

 

    if((*str == '-') || (*str == '+')) //如果字符串的第一个字符是-或者+那么就将str向后移一位;

    {

        str++;

    }

 

    while(str)

    {

        if((*str < '0') || (*str > '9')) //如果遇到不是数字的字符就退出循环

            break;

        temp = temp * 10 + (*str - '0'); //将每个字符转为相应的数字

        str++;

    }

    if(*ptr == '-')

    {

        temp = -temp;

    }

 

    return temp;

}</iostream>

   

三、编程实现strcpy函数

   

#include <iostream>

#include <cstring>

 

using namespace std;

 

void  mystrcpy(char *newstr, const char *oldstr);

 

int main(int argc, char **argv)

{

    char str[40] = "0";

    char ptr[20];

 

    cout << "请输入一个字符串: " ;

    cin.getline(str, 40);

    mystrcpy(ptr, str);

    cout << ptr << endl;

    return 0;

}

 

void mystrcpy(char *newstr, const char *oldstr)

{

    if((newstr == NULL) || (oldstr == NULL)) //判断这两个字符串的有效性

        return;

    while(*oldstr)

    {

        *newstr++ = *oldstr++;

    }

    *newstr = '\0';  //将最后一个字符赋值为'\0'结尾

}</cstring></iostream>

   

四、strcpy和memcpy的区别

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容。

2、复制的方法不同。strcpy不需要指定长度,它遇到'\0'就会结束。memcpy需要根据第三个参数决定复制的长度。

3、用途不同。strcpy一般用于复制字符串,memcpy主要用于复制其他类型数据。

五、计算字符串长度的两种不同实现方法

1、通过一个局部变量计算有多少个字符。

int mystrlen(const char *str)

{

    int temp = 0;

    while(*str != '\0')

    {

        temp++;

        str++;

    }

    return temp;

}

   

这个在遍历的时候有两个变量在执行自增操作。

2、通过一个局部变量来记录遍历前str的位置,然后用遍历之后的地址减去之前的地址就是字符串的长度。

   

int mystrlen2(const char *str)

{

    if(str == NULL)

        return 0;

    const char* ptr = str;

 

    while(*str)

    {

        str++;

    }

 

    return (str - ptr);

}

   

这个在遍历的时候只要一个变量执行自增操作,所以效率会高很多,尤其是在字符串很长的情况下。

六、编程实现字符串中子串的查找

#include <iostream>

 

using namespace std;

 

const char* strstr(const char *src, const char* sub);

 

int main(int argc, char **argv)

{

    char p[] = "12346";

    char q[] = "45";

    const char *r = strstr(p,q);

    if(NULL == r)

            cout << "找不到这个字符串"<< endl;

    cout << r << endl;

    return 0;

}

 

const char* strstr(const char *src, const char* sub)

{

    const char *bp;

    const char *sp;

 

    if((src == NULL) || (sub == NULL)) //判断这两个字符串的有效性

        return src;

    while (*src)

    {

        bp = src; //用于内层循环,这样就不会改变src的地址

        sp = sub; //用于内层循环,这样就保护会改变sub的地址

        while(*bp++ == *sp++)

        {

            if(*sp == '\0')//如果找到了sub字符串就退出。

                return src;

        }

        src++; //将src自增

    }

    return NULL;

}</iostream>

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程