C和C++字符串问题解析
程序员文章站
2022-03-26 17:48:29
在c和c++中没有字符串变量,字符串通常都是用一个字符数组来存放的。
这一章的题目能够让我们更好的掌握对数组的运用。
一、不使用库函数将整数转换为字符串
#include
using n...
在c和c++中没有字符串变量,字符串通常都是用一个字符数组来存放的。
这一章的题目能够让我们更好的掌握对数组的运用。
一、不使用库函数将整数转换为字符串
#include 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 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 #include 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 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; }