在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;
}
二、不使用库函数将字符串转为数字
#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;
}
三、编程实现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'结尾
}
四、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;
}