字符串转成数字
需要考虑:
1、输出指针是否为空
2、输入的字符串第一位是否为正负号“+”“-”
3、输入的字符串是否包含非数字的字符,若包含,直接返回0;
4、数字若溢出,返回0; std::numeric_limits<int>::max()返回编译器允许的 int 型数 最大值
#define PosNumMin 0
#define NegNumMin ((signed int) 0x80000000)
#define NumMax 0x7fffffff
int str2num(const char*str, int len)
{
assert(str != NULL);
int flag = 0; // 0:正 1:负
int num = 0;
int i = 0;
// 第一位有可能是符号位
if (str[0] == '+')
{
i++;
}
else if (str[0] == '-')
{
flag = 1;
i++;
}
for (; i<len; i++)
{
if (str[i] >= '0' && str[i] <= '9')
{
num = num * 10 + (str[i] - '0');
if ((flag && (num > NumMax || num < NegNumMin)) || (num < PosNumMin || num>NumMax))
{
cout << "数值溢出" << endl;
break;
}
}
else //包含非数字字符
{
cout << "包含非数字字符" << endl;
break;
}
}
if (flag == 1)
{
num = - num;
}
return num;
}
字符串连接strcat()
#include<cassert>
//自定义实现strcat()函数
char* myStrcat(char* dst, const char* src)
{
assert((dst!=NULL) && (src!=NULL));
char* temp = dst; //记录字符串dst的首地址
while (*(temp)) // 找到str1的末尾
{
temp++;
}
while (*(src)) // '\0'会转换为十进制0
{
*temp++ = *src++;
}
*temp = '\0';
return dst;
}
字符串拷贝strcpy()
#include <cassert>
//自定义实现strcpy()函数
char* myStrcpy(char* dst, const char* src)
{
assert((dst!=NULL) && (src!=NULL));
char* temp = dst;
while (*(src)) // '\0'会转换为十进制0
{
*dst++ = *src++;
}
*dst = '\0';
return temp;
}
自定义memcpy()
void* myMemcpy(void *memTo, void const*memFrom, int size)
{
assert(memTo != NULL);
assert(memFrom != NULL);
char* tempTo = (char*)memTo;
char* tempFrom = (char*)memFrom;
while (size-- > 0)
{
*tempTo++ = *tempFrom++;
}
return memTo;
}
字符串比较strcmp()
如果返回值 = -2,则表示出错
如果返回值 = -1,则表示 str1 小于 str2
如果返回值 = 1 ,则表示 str2 小于 str1
如果返回值 = 0,则表示 str1 等于 str2
int myStrcmp(const char* str1, const char*str2)
{
assert((str1!=NULL) && (str2!=NULL));
while (*(str1) == *(str2) && *(str1) && *(str2)) // '\0'会转换为十进制0
{
str1++;
str2++;
}
if (*(str1) > *(str2))
return 1;
else if (*(str1) < *(str2))
return -1;
else
return 0;
}
字符串移位包含问题
若s1 = "ABNFG",s2 = "NFGA", 则s2包含在s1s1=“ABNFGABNFG”中
bool findStr(const char* str1, const char* str2)
{
assert((str1!=NULL) && (str2!=NULL));
int len1 = strlen(str1);
int len2 = strlen(str2);
int i = 0;
int j = 0;
for (; i<len1 * 2 - 1; i++)
{
while (str1[i%len1] == str2[j] && j<len2)
{
i++;
j++;
}
if (j == len2)
{
return true;
}
else
{
i = i - j;//关键一步
j = 0;
}
}
return false;
}
字符串长度strlen()
int myStrlen(char const* str)
{
assert(str!=NULL);
char const* temp = str;
while (*temp++);
return temp - str-1;
}