20160218.CCPP体系详解(0028天)
Posted 尹成
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20160218.CCPP体系详解(0028天)相关的知识,希望对你有一定的参考价值。
程序片段(01):加法.c
内容概要:字符串计算表达式
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//01.去除空格:
// 1.空格:空格+Tab键+类似符...
// 2.双索引+双指针
// 变化快+变化慢:变化快覆盖变化慢
void removeBlankSpaceByIndex(char * pStr)
{//双索引
int i = 0;
int j = 0;
//while (‘\0‘ != *(pStr + j))
//{
// *(pStr + i) = *(pStr + j);
// if (‘ ‘ != *(pStr + i))
// {
// ++i;//补位|缺位-->替换|不替换
// }
// ++j;
//}
//*(pStr + i) = ‘\0‘;//重新标识结束
while (‘\0‘ != (*(pStr + i) = *(pStr + j++)))
{
if (‘ ‘ != *(pStr + i))
{//控制移位
++i;
}
}
}
void removeBlankSpaceByPoint(char * pStr)
{//双指针
char * p1 = pStr;
char * p2 = pStr;
//while (‘\0‘ != *p2)
//{
// *p1 = *p2;
// if (‘ ‘ != *p1)
// {
// ++p1;
// }
// ++p2;
//}
//*p1 = ‘\0‘;
while (‘\0‘ != (*p1 = *p2++))
{
if (‘ ‘ != *p1)
{
++p1;
}
}
}
int isNum(char chr)
{
if (‘0‘ <= chr && chr <= ‘9‘)
{
return 1;
}
return 0;
}
//02.数据提取法:
//整数提取法:
// mutiple:0----->10----->100
// int:x----->xy----->xyz
// value=int*10:先升位
// value=value+num:后补位
//小数提取法:
// mutiple:0.1--->0.01--->0.001
// double:0.x--->0.xy--->0.xyz
// value= value+mutiple*num
double getNum(char * pStr, int * pIndex)
{
double dbInt = 0.0;
int index = *pIndex;
while (isNum(*(pStr + index)))
{//整数部分
dbInt = dbInt * 10 + *(pStr + index) - ‘0‘;
++index;
}
if (‘.‘ == *(pStr + index))
{
double dbDouble = 1.0;
while (isNum(*(pStr + (++index))))
{//小数部分
dbDouble /= 10;
dbInt += dbInt + dbDouble * (*(pStr + index) - ‘0‘);
}
}
*pIndex = index;
return dbInt;
}
//03.核心控制计算:
double caculate(char * pStr)
{
double value = 0.0;
int index = 0;
value = getNum(pStr, &index);
while (1)
{
char op = *(pStr + index);
++index;
switch (op)
{
case ‘\0‘:
{
return value;
break;
}
case ‘+‘:
{
value += getNum(pStr, &index);
break;
}
case ‘-‘:
{
value -= getNum(pStr, &index);
break;
}
default:
break;
}
}
return value;
}
//04.常量表达式递归解析:
// 1.运算符优先级结合性
// 2.树状结构模拟计算流
// 3.严格控制计算顺序流
int main01(void)
{
char str[1024] = { 0 };
scanf("%[^\n]", str);
printf("待计算的常量表达式为:%s \n", str);
//removeBlankSpaceByIndex(str);
removeBlankSpaceByPoint(str);
printf("经过预处理后的常量表达式为:%s \n", str);
int index = 0;
double value = getNum(str, &index);
printf("第一个获取的数据为:%lf \n", value);
printf("该常量表达式的计算结果为:%lf \n", caculate(str));
system("pause");
}
程序片段(02):乘除法.c
内容概要:乘除法
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void removeBlankSpace(char * pStr)
{
char * p1 = pStr;
char * p2 = pStr;
while (‘\0‘ != (*p1 = *p2++))
{
if (‘ ‘ != *p1)
{
++p1;
}
}
}
int isNum(char chr)
{
if (‘0‘ <= chr && chr <= ‘9‘)
{
return 1;
}
return 0;
}
double getNum(char * pStr, int * pIndex)
{
double dbInt = 0;
int index = *pIndex;
while (isNum(*(pStr + index)))
{
dbInt += dbInt * 10 + (*(pStr + index) - ‘0‘);
++index;
}
if (‘.‘ == *(pStr + index))
{
double dbDouble = 1.0;
while (isNum(*(pStr + (++index))))
{
dbDouble /= 10;
dbInt += dbDouble*(*(pStr + index) - ‘0‘);
}
}
*pIndex = index;
return dbInt;
}
double caculateMulDiv(char * pStr, int * pIndex)
{
double value = 0.0;
value = getNum(pStr, pIndex);
while (1)
{
if (‘*‘ == *(pStr + *pIndex))
{
(*pIndex)++;
value *= getNum(pStr, pIndex);
}
else if (‘/‘ == *(pStr + *pIndex))
{
(*pIndex)++;
value /= getNum(pStr, pIndex);
}
else
{
break;
}
}
return value;
}
double caculateAddSub(char * pStr)
{
double value = 0.0;
int index = 0;
value = caculateMulDiv(pStr, &index);
while (1)
{
char op = *(pStr + index);
++index;
switch (op)
{
case ‘\0‘:
{
return value;
}
case ‘+‘:
{
value += caculateMulDiv(pStr, &index);
break;
}
case ‘-‘:
{
value -= caculateMulDiv(pStr, &index);
break;
}
default:
break;
}
}
return value;
}
int main01(void)
{
char str[1024] = { 0 };
scanf("%[^\n]", str);
printf("待计算的常量表达式为:%s \n", str);
removeBlankSpace(str);
printf("经过预处理之后的常量表达式为:%s \n", str);
//int index = 0;
//double value = getNum(str, &index);
//printf("第一个获取到的数据为:%lf \n", value);
printf("常量表达式的计算结果为:%lf \n", caculateAddSub(str));
system("pause");
}
程序片段(03):括号.c
内容概要:括号
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void removeBlankSpace(char * pStr)
{
char * p1 = pStr;
char * p2 = pStr;
while (‘\0‘ != (*p1 = *p2++))
{
if (‘ ‘ != *p1)
{
p1;
}
}
}
int isNum(char chr)
{
if (‘0‘ <= chr && chr <= ‘9‘)
{
return 1;
}
return 0;
}
double getNum(char * pStr, int * pIndex)
{
double dbInt = 0;
int index = *pIndex;
while (‘(‘ == *(pStr + index))
{
char * pSubStr = NULL;
*pIndex += ++index;
pSubStr = caculateParenthese(pStr, pIndex);
double caculateAddSub(char * pstr);
dbInt = caculateAddSub(pSubStr);
free(pSubStr);
pSubStr = NULL;
return dbInt;
}
while (isNum(*pStr + index))
{
dbInt = dbInt * 10 + (*(pStr + index) - ‘0‘);
++index;
}
if (‘.‘ == *(pStr + index))
{
double dbDouble = 1.0;
while (isNum(*(pStr + (++index))))
{
dbDouble /= 10;
dbInt = dbDouble * (*(pStr + index) - ‘0‘);
}
}
*pIndex = index;
return dbInt;
}
char * caculateParenthese(char * pStr, int * pIndex)
{
char * tmpStr = NULL;
int num = 0;//括号对数
int leftIndex = *pIndex;//左索引位置
do
{
switch (*(pStr + *pIndex))
{
case ‘(‘:
{
++num;
break;
}
case ‘)‘:
{
if (0 == num)
{
++(*pIndex);
tmpStr = (char *)malloc((*pIndex - leftIndex) * sizeof(char));
strncpy_s(tmpStr, *pIndex - leftIndex, pStr + leftIndex, *pIndex - leftIndex - 1);
printf("%s \n", tmpStr);
return tmpStr;
}
else
{
--num;
}
break;
}
}
} while (‘\0‘ != *(pStr + (*pIndex)++));
}
double caculateMulDiv(char * pStr, int * pIndex)
{
double value = 0.0;
value = getNum(pStr, pIndex);
while (1)
{
if (‘*‘ == *(pStr + *pIndex))
{
++(*pIndex);
value *= getNum(pStr, pIndex);
}
else if (‘/‘ == *(pStr = *pIndex))
{
++(*pIndex);
value /= getNum(pStr, pIndex);
}
else
{
break;
}
}
return value;
}
double caculateAddSub(char * pStr)
{
double value = 0.0;
int index = 0;
value = caculateMulDiv(pStr, &index);
while (1)
{
char op = *(pStr + index);
++index;
switch (op)
{
case ‘\0‘:
return value;
case ‘+‘:
{
value += caculateMulDiv(pStr, &index);
break;
}
case ‘-‘:
{
value += caculateMulDiv(pStr, &index);
break;
}
default:
break;
}
}
}
//01.常量表达式计算流程:
// 加减法-->乘除法-->小括号
int main(void)
{
char str[1024] = { 0 };
scanf("%[^\n]", str);
removeBlankSpace(str);
printf("%lf \n", caculateAddSub(str));
system("pause");
}
程序片段(04):DelStr.c
内容概要:删除指定字符串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
//删除首个指定字符
void delFirstChrByIndex(char * pStr, char chr)
{
char * p = strchr(pStr, chr);
if (NULL == p)
{
return;
}
for (int i = 0; i < strlen(p); ++i)
{
*(p + i) = *(p + i + 1);
}
}
void delFirstChrByPoint(char * pStr, char chr)
{
char * p = strchr(pStr, chr);
if (NULL == p)
{
return;
}
char * p1 = p;
char * p2 = p + 1;
//while (‘\0‘ != *p1)
//{
// *p1 = *p2;
// ++p2;
// ++p1;
//}
//while (*p1)//*p1<=>*p1!=0<=>*p1!=‘\0‘
//{
// *p1 = *p2;
// ++p2;
// ++p1;
//}
//while (*p1++ = *p2++);
//while (*p1 = *(p1++ + 1));
}
//删除相同指定字符
void delAllChrByIndex(char * pStr, char chr)
{
int i = 0;
int j = 0;
while (‘\0‘ != *(pStr + i))
{
*(pStr + i) = *(pStr + j);
if (chr != *(pStr + i))
{
++i;
}
++j;
}
}
void delAllChrByPoint(char * pStr, char chr)
{
char * p1 = pStr;
char * p2 = pStr;
//while (‘\0‘ != *p1)
//{
// *p1 = *p2;
// if (chr != *p1)
// {
// ++p1;
// }
// ++p2;
//}
while (‘\0‘ != (*p1 = *p2++))
{
*p1 = *p2;
if (chr != *p1)
{
++p1;
}
}
}
//删除首个指定字符串
void delFirstStrByIndex(char * pStr, char * pSubStr)
{
char * p = strstr(pStr, pSubStr);
if (NULL == p)
{
return;
}
int pLen = strlen(p);
int subStrLen = strlen(pSubStr);
int validLen = pLen - subStrLen;
for (int i = 0; i <= validLen; ++i)
{
*(p + i) = *(p + i + subStrLen);
}
}
void delFirstStrByPoint(char * pStr, char * pSubStr)
{
char * p = strstr(pStr, pSubStr);
if (NULL == p)
{
return;
}
int subStrLen = strlen(pSubStr);
char * p1 = p;
char * p2 = p + subStrLen;
//while (‘\0‘ != *p1)
//{
// *p1 = *p2;
// ++p2;
// ++p1;
//}
//while (‘\0‘ != (*p1 = *p2))
//{
// ++p2;
// ++p1;
//}
//while (‘\0‘ != (*p1++ = *p2++));
while (‘\0‘ != (*p1 = *(p1++ + subStrLen)));
}
//删除相同字符串
void delAllStrByIndex(char * pStr, char * pSubStr)
{
int i = 0;
int j = 0;
int subStrLen = strlen(pSubStr);
while (‘\0‘ != (*(pStr + i) = *(pStr + j)))
{
int flag = 1;
for (int k = 0; k < subStrLen; ++k)
{
if (‘\0‘ == *(pStr + j + k) || *(pStr + j + k) != *(pSubStr + k))
{
flag = 0;
break;
}
}
if (!flag)
{
++j;
++i;
}
else
{
j += strlen(pSubStr);
}
}
}
void delAllStrByPoint(char * pStr, char * pSubStr)
{
char * p1 = pStr;
char * p2 = pStr;
while (‘\0‘ != (*p1 = *p2))
{
int flag = 1;
char * px = p2;
char * py = pSubStr;
while (‘\0‘ != *py)
{
if (‘\0‘ == *px || *px != *py)
{
flag = 0;
break;
}
++px;
++py;
}
if (!flag)
{
++p1;
++p2;
}
else
{
p2 += strlen(pSubStr);
}
}
}
int main01(void)
{
char str[1024] = "i love china i love you i love money i love girl";
printf("%s \n", str);
//delFirstChrByIndex(str, ‘i‘);
//delFirstChrByPoint(str, ‘i‘);
//delAllChrByIndex(str, ‘i‘);
//delAllChrByPoint(str, ‘i‘);
//delFirstStrByIndex(str, "love");
//delFirstStrByPoint(str, "love");
//delAllStrByIndex(str, "love");
//delAllStrByPoint(str, "love");
printf("%s \n", str);
system("pause");
}
void delAllWStrByPoint(wchar_t * pWStr, wchar_t * pSubWStr)
{
wchar_t * p1 = pWStr;
wchar_t * p2 = pWStr;
while (L‘\0‘ != (*p1 = *p2))
{
int flag = 1;
wchar_t * px = p2;
wchar_t * py = pSubWStr;
while (L‘\0‘ != *pSubWStr)
{
if (L‘\0‘ == *px || *px != *py)
{
flag = 0;
break;
}
++px;
++py;
}
if (!flag)
{
++p1;
++p2;
}
else
{
p2 += wcslen(pSubWStr);
}
}
}
//01.连接较长字符串:
// 1.单行法
// 2.反斜杠(结尾)
int main02(void)
{
//wchar_t wstr[1024] = "上联:试问中国男足几多愁. 下联:恰似一群太监上青楼. 横联:无人能射上联:再问中国男足几多愁.下联:恰似一群妓女守青楼.横联:总是被射上联:三问中国男足几多愁.下联:恰似阳痿患者逛青楼.横联 : 欲射不能 上联:四问中国男足几多愁.下联:恰似一群小孩上青楼.横联 : 尚不能射上联:五问中国男足几多愁.下联:恰似一群傻瓜去青楼.横联 : 往哪里射上联:六问中国男足几多愁.下联:恰似跑堂杂役在青楼.横批 : 看别人射love love love love love love love love中国队要是能进球,我就投案自首!--拉登 中国队要是能进球,我就停止核武器!--内贾德中国队要是能进球,我就改革开放!--金三胖中国队要是能进球,我就把靖国神社拆了!--小泉纯一郎中国队要是能进球,我就认拉灯当干爹!--布什 中国队要是能进球,我就信佛!--上帝中国队要是能进球,我就信上帝!--释迦牟尼中国队要是能进球,我就回归!--阿扁中国队要是能进球,我马上复活--阿拉法特 中国队要是能进球,我们就辞职!--中国足协最后说中国队要是能进球, 我就倒着转!--地球说 中国对要是能进球, 我就从西边出来!--太阳说 中国对要是能进球, 我就去给猫当伴娘!--耗子说 中国对要是能进球, 我就再爆炸一次!-宇宙最后说 ";
//"\"起到连接的作用,当做整体分行
setlocale(LC_ALL, "zh-CN");
wchar_t wstr[1024] = L"上联:试问中国男足几多愁. 下联:恰似一群太监上青楼. 横联:无人能射 上联:再问中国男足几多愁.下联:恰似一群妓女守青楼.横联:总是被射 上联:三问中国男足几多愁.下联:恰似阳痿患者逛青楼.横联 : 欲射不能 上联:四问中国男足几多愁.下联:恰似一群小孩上青楼.横联 : 尚不能射 上联:五问中国男足几多愁.下联:恰似一群傻瓜去青楼.横联 : 往哪里射 上联:六问中国男足几多愁.下联:恰似跑堂杂役在青楼.横批 : 看别人射 love love love love love love love love 中国队要是能进球,我就投案自首!--拉登 中国队要是能进球,我就停止核武器!--内贾德 中国队要是能进球,我就改革开放!--金三胖 中国队要是能进球,我就把靖国神社拆了!--小泉纯一郎 中国队要是能进球,我就认拉灯当干爹!--布什 中国队要是能进球,我就信佛!--上帝 中国队要是能进球,我就信上帝!--释迦牟尼 中国队要是能进球,我就回归!--阿扁 中国队要是能进球,我马上复活--阿拉法特 中国队要是能进球,我们就辞职!--中国足协最后说 中国队要是能进球, 我就倒着转!--地球说 中国对要是能进球, 我就从西边出来!--太阳说 中国对要是能进球, 我就去给猫当伴娘!--耗子说 中国对要是能进球, 我就再爆炸一次!-宇宙最后说 ";
wchar_t str[10] = L"中国";
delAllWStrByPoint(wstr, str);
wprintf(L"%ls", wstr);
system("pause");
}
程序片段(05):01.字符串切割以及动态分配.c+02.strtok.c
内容概要:字符串切割以及字典
///01.字符串切割以及动态分配.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//01.C语言没有空字符!
// 注:没有(‘‘)的说法
//02.字符串操作:
// 切割+字典
//03.strtok原理:
// 1.内存替换指定字符为‘\0‘
// 2.内存切割到‘\0‘
int getChrCount(char * pStr, char chr)
{
if (NULL == pStr)
{
return -1;
}
int i = 0;
for (char * p = strchr(pStr, chr); NULL != p; p = strchr(p + 1, chr))
{
++i;
}
return i;
}
void removeBlankSpace(char * pStr, char chr)
{
char * p1 = pStr;
char * p2 = pStr;
while (*p1 = *p2)
{
if (chr != *p1)
{
++p1;
}
++p2;
}
}
//04.单个字符串:
// 1.整体存储
// 2.多行显示
//注:需要使用反斜杠(‘\‘)标识
int main01(void)
{
char str[2048] = "我们还是当朋友好了 ( 其实你还有可以利用的价值) 我想我真的不适合你 ( 我根本就不喜欢你!) 其实你人真的很好 ( 可是我不想和你在一起) 你人真的很好 ( 我是真的不想和你在一起) 你人真的真的很好....真的 ( 猪头, 离我远一点!) 我暂时不想交男朋友 ( 闪边啦!你还不到我心中帅哥标准的一半) 我不想伤害我们之间的友谊 ( 我们之间也只会有友谊) 我心中牵挂着一个人 ( 那个人是我专门为你这种人虚构的) 我从来没想过这个问题 ( 这是根本不可能的.还用想吗 ? ) 我不适合当个情人 ( 废话, 没人会适合当你的情人的) 你给我一段时间考虑 ( 不给我时间, 我怎么溜啊) 你的条件真的很好 ( 可是还没好到我想要的地步) 可是这样的感觉好怪 ( 你这丑八怪, 怪到这样还想吃天鹅肉 ? ) 你的温柔我会铭记在心的 ( 拜托, 情圣!光温柔是没用的, 还要有钱!) 其实我一直没勇气接受你( 看到你差点吓死, 哪还有勇气 ? ) 你真的很可爱 ( 你真的很幼稚) 你真的是超级可爱啦 ( 猪头, 不要象小孩那样缠着我!) 遇到你, 总会让我重温童年的快乐 ( 就象阿姨遇到小弟弟那样) 我们应该给彼此一点缓冲时间 ( 给你时间快滚, 再不走我要翻脸啦!) 别人都说你条件不错啊 ( 可我从来没这样认为!) 如果我们早点认识就好了 ( 可以让你早点觉悟!) 别急嘛, 我们可以做朋友 ( 趁这个时候我要找到我的白马王子啊~) ";
int num = getChrCount(str, ‘)‘);
printf("该字符串一共存在%d行! \n", num);
char ** strAll = (char **)malloc(num * sizeof(char *));
char ** strSay = (char **)malloc(num * sizeof(char *));
char ** strThink = (char **)malloc(num * sizeof(char *));
int i = 0;
for (char * p = strtok(str, ")"); NULL != p; p = strtok(p + strlen(p) + 1, ")"))
{
if (i < num)
{
*(strAll + i) = (char *)malloc((strlen(p) + 1) * sizeof(char));
strcpy(*(strAll + i), p);
//removeBlankSpace(*(strAll + i), ‘\t‘);
//printf("%s \n", *(strAll + i));
}
++i;
}
for (int i = 0; i < num; ++i)
{
char * pStr = *(strAll + i);
pStr = strtok(pStr, "(");
*(strSay + i) = (char *)malloc((strlen(pStr) + 1)*sizeof(char));
strcpy(*(strSay + i), pStr);
pStr = pStr + strlen(pStr) + 1;
*(strThink + i) = (char *)malloc((strlen(pStr) + 1)*sizeof(char));
strcpy(*(strThink + i), pStr);
}
char myStr[128] = { 0 };
scanf("%s", myStr);
int flag = 0;
for (int i = 0; i < num; ++i)
{
char * p = strstr(strSay[i], myStr);
if (NULL != p)
{
flag = 1;
printf("说的是:%s,想的却是:%s \n", strSay[i], strThink[i]);
break;
}
}
if (!flag)
{
printf("可以问芳姐! \n");
}
system("pause");
}
///02.strtok.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//01.strtok原理:
// 1.内存替换(‘\0‘)
// 2.内存返回首地址
//注:不宜字符串常量池
char * myStrTok(char * pStr, char * pSplit)
{
char * p = strstr(pStr, pSplit);
if (NULL != p)
{
*p = ‘\0‘;
return pStr;
}
return NULL;
}
int main(void)
{
//char * str = "123,qwer,thjk,qsdf";//strtok不适合常量
char str[100] = "123,qwer,thjk,qsdf";
for (char * p = myStrTok(str, ","); NULL != p; p = myStrTok(p + strlen(p) + 1, ","))
{
printf("%s \n", p);
}
char * p = strtok(str, ",");//strtok:传递字符串进行切割
//替换为(‘\0‘)
printf("%s \n", p);
for (int i = 0; i < 100; ++i)
{
printf("%d, %c \n", *(str + i), *(str + i));
}
system("pause");
}
程序片段(06):scanfsprintf.c
内容概要:字符串获取打印sscanfsprintf
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//01.对字符串扫描打印:
// 字符串扫描:sscanf(str, 格式字符串, 地址列表);
// 跨函数修改内存-->地址列表(修改原本)
// 字符串打印:sprintf(str, 格式字符串, 内存列表);
// 跨函数读取内存-->内存列表(读取副本)
//注:分为直接解析(普通变量)和间接解析(指针变量)
//02.strtol();(数值/单位)函数
// char * unit;
// long price = strtol(str, &unit, 10);
// 按照指定进制数;从待读取字符串起始位置往后进行读取,遇到非数字字符结束读取状态
// 并将非数字字符的位置给记录下来
int main01(void)
{
char str[1024] = "124784 # T小姐 # 女 # 22# 168 #在校学生 # 10000元/天 # 北京电影学院学生,形象气质佳,可爱高雅有品位,出身良好,富有才情和浪漫,英语非常流利,喜欢旅游,常去欧洲度假,只针对高端有实力客户,不接收任何陌生来电,发短信即可,北京1W每次,外地另议。接受价格再与我联系,无实力者勿扰,不要浪费彼此时间,切记!# 18600959828 # 1002823878@qq.com # 2289557521";
for (int i = 0; i < strlen(str); ++i)
{//字符串预处理
if (‘#‘ == *(str + i))
{
*(str + i) = ‘ ‘;
}
}
int id;
char name[10];
char gender[10];
int age;
int height;
char identity[10];
char price[100];
char introduce[500];
long long telephone;
char email[100];
long long QQ;
sscanf(str, "%d%s%s%d%d%s%s%s%lld%s%lld", &id, name, gender, &age, &height, identity, price, introduce, &telephone, email, &QQ);
//printf("id:%d, name:%s, gender:%s, age:%d, height:%d, identity:%s, price:%s, introduce:%s, telephone:%lld, email:%s, QQ:%lld \n", id, name, gender, age, height, identity, price, introduce, telephone, email, QQ);
char * pos;
int cost = strtol(price, &pos, 10);//strtol:从前往后读取整数,遇到非数字终止,10代表十进制读取方式
printf("cost:%d, pos:%s \n", cost, pos);//pos的值为找到的第一个非数字的字符指针
//
//char newStr[1000];
//sprintf(newStr, "编号为%d, 名字为%s, 性别为%s, 年龄为%d, 身高为%d %s%s%s%lld%s%lld \n", id, name, gender, age, height, identity, price, introduce, telephone, email, QQ);
//printf("%s \n", newStr);
system("pause");
}
程序片段(07):01.strdup.c+02.strerror.c+03.strncpy.c+04.strpbrk.c+05.strrchr.c+06.strrev.c+07.strspn.c
内容概要:字符串常用函数
///01.strdup.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * myStrDup(char * pStr)
{
char * p = (char *)malloc((strlen(pStr) + 1)*sizeof(char));
strcpy(p, pStr);
return p;
}
//01.strdup();(类strcpy)函数:
// 格式:char * p = strdup(str);
// 原理:为字符指针变量p2分配字符串存储空间;
// 将字符串str的所有字符内容拷贝到分配的存储空间当中
//注:注意该拷贝后的字符串位于堆内存,需要手动进行回收
int main01(void)
{
char * p1 = NULL;
char * p2 = "calc";
//*p2 = ‘A‘;
p1 = _strdup(p2);
printf("p1:%s \n", p1);
free(p1);
system("pause");
}
///02.strerror.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>//采用预置宏定义error
//01.strerror();(字符串错误)函数
// 格式:char * errorInfo = strerror(errno);
// 原理:一旦发生字符串相关错误,strerror(errno);就能检测到字符串错误
// 并且返回字符串的错误相关信息
int main02(void)
{
char * errorInfo = strerror(errno);
printf("errorInfo:%s \n", errorInfo);
system("pause");
}
///03.strncpy.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * myStrNCpy(char * pDest, char * pSrc, int maxLen)
{
if (NULL == pDest || NULL == pSrc)
{
return NULL;
}
char * pTemp = pDest;
for (int i = 0; i < maxLen; ++i)
{
*(pTemp + i) = *(pSrc + i);
}
return pDest;
}
//01.strncpy();(指定字符数拷贝)
// 格式:char * strncpy(char * destin, char * source, int maxLen);
// 原理:从源字符串当中拷贝指定长度的字符序列到目标字符指针位置
//注:没有涉及到临时缓冲区问题,是一个一个的映射关系
int main03(void)
{
char str[10] = "task";
char newStr[10] = "list";
//strncpy(str + 4, newStr, 4);
myStrNCpy(str + 4, newStr, 4);
system(str);
system("pause");
}
///04.strpbrk.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//01.strpbrk();(在串中查找给定字符集中的(首个)字符)
//
// 在pDest这个字符集当中查找另外一个字符集pSrc当中首个
// 出现的字符
char * myStrPBrk(char * pDest, char * pSrc)
{
if (NULL == pDest || NULL == pSrc)
{
return NULL;
}
while (‘\0‘ != *pSrc)
{
char * pTemp = pDest;
while (‘\0‘ != *pTemp)
{
if (*pSrc == *pTemp)
{
return pTemp;
}
++pTemp;
}
++pSrc;
}
return NULL;
}
int main04(void)
{
char str1[10] = "abcdefg";
char str2[10] = "123g";
//char * pRes = strpbrk(str1, str2);
char * pRes = myStrPBrk(str1, str2);
printf("%s, %c \n", pRes, *pRes);
system("pause");
}
///05.strrchr.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//01.strrchr();(字符串当中逆序查找给定字符)
// 格式:char * strrchr(char * pStr, char chr);
// 原理:逆序遍历字符串当中的每个字符进行对比
char * myStrRChr(char * pStr, char chr)
{
if (NULL == pStr)
{
return NULL;
}
for (char * p = pStr + strlen(pStr) - 1; p >= pStr; --p)
{
if (chr == *p)
{
return p;
}
}
return NULL;
}
int main05(void)
{
char str[100] = "calc123";
char * p1 = strrchr(str, ‘c‘);
char * p2 = myStrRChr(str, ‘c‘);
printf("p1:%s, p2:%s \n", p1, p2);
system("pause");
}
///06.strrev.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
void setChr0(wchar_t * pWStr)
{
wchar_t *pTemp = pWStr;
while (L‘\0‘ != *pTemp)
{
if (L‘ ‘ == *pTemp)
{
*pTemp = L‘\0‘;
}
++pTemp;
}
}
void setChrSpace(wchar_t * pWStr)
{
for (int i = 0; i < 7; ++i)
{
if (L‘\以上是关于20160218.CCPP体系详解(0028天)的主要内容,如果未能解决你的问题,请参考以下文章