五大板块(5)——字符串
参考:五大板块(5)——字符串
作者:丶PURSUING
发布时间: 2021-03-18 16:03:48
网址:https://blog.csdn.net/weixin_44742824/article/details/114982019
一、字符串的定义方式与输出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i;
//定义方式一
char str1[3] = {'a','b','c'};
//定义方式二
char str2[3] = "abc";
//定义方式三
char str3[] = "chen li chen mei wo shuai";
//输出方式一:for循环拼接多个字符
for(i=0;i<sizeof(str3)/sizeof(str3[0]);i++){
printf("%c",str3[i]);
}
//输出方式二:
printf("%s\n",str3);
//输出方式三:调用字符串API
puts(str3);
return 0;
}
结果:
chen li chen mei wo shuaichen li chen mei wo shuai
chen li chen mei wo shuai
- 1
- 2
其中第三种定义方式 char str3[] = "str"; 不指明数组的大小,只给出了数组名,而数组名的值是个指针常量,也就是数组第一个元素的地址。
是不是可以猜想,首地址就是字符串的关键呢?
而指针也指明了地址,故可以用指针的方式定义字符串,即字符串指针。也是定义字符串的常用方式。
char* name = "huatianzhu";
- 1
注意: 这里说的定义是同时赋值,而不是等待赋值。之所以不需要给指针name分配空间,是因为进行了初始化,编译的时候系统就知道需要分配多大的空间,否则要开辟空间。(后文中也有涉及)。
二、字符串的结尾是 ’ \0 ’
字符串都是以类似于下面的方式输出:遇到 ‘\0’
#include <stdio.h>
int main()
{
int i;
char str[] = "abcd";
while(str[i] != '\0'){
printf("%c",str[i]);
i++;
}
return 0;
}
strlen计算有效字符长度(不包括’\0’) / sizeof计算内存长度(包括‘\0’)
在很多场景,我们都需要在程序的执行过程中录入字符串,如下:
#include <stdio.h>
#include <string.h>
int main()
{
char name[128];//系统预分配空间
printf("请输入名字\n");
scanf("%s",name);//才能进行赋值
printf("sizeof计算:%d\n",sizeof(name)/sizeof(name[0]));
printf("strlen计算:%d\n",strlen(name));
return 0;
}
运行结果:
请输入名字
huatianzhu
sizeof计算:128
strlen计算:10
- 1
- 2
- 3
- 4
实际上huatianzhu长这样:
huatianzhu\0\0\0\0.....
- 1
strlen当遇到\0时便停止计算,是专门用来计算字符串的长度。
这时候你好奇了,输入中文字符,用strlen计算是多少?
输入:
华天朱
- 1
可以发现结果是 9.这与linux系统采用utf-8的编码方式相关,一个汉字占用3个字节。
strlen使用(1)注意字符数组当做字符串来用?
有一个说法是:把字符数组当做字符串来使用时,最后一个元素要是'\0',否则strlen()计算时就会发生“停不下来”,直到遇到内存的'\0',故计算出来就不会是一个准确的值。例如:
#include <stdio.h>
#include <string.h>
int main()
{
char array[5] = {'a','b','c','d','e'};
printf("%d\n",strlen(array));
return 0 ;
}
可我放在树莓派上运行,结果都是5。而在啊哈C中,都是6。
- 1
三、字符串操作常用API
字符串操作函数的使用方法都很简单,在这里做个系统的了解,之后想用不会直接面向百度开发即可。
puts、gets —— 输入与输出
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char* str = (char *)malloc(128);//直接赋值NULL不行,必须malloc开辟空间 有笔有纸才能写
if(str == NULL){
printf("malloc error\0");//malloc开辟空间可能会失败 同时注意内存泄漏
exit(-1);
}
memset(str,'\0',128);
printf("请输入任意字符串\n");
gets(str);
puts(str);//内置了一个\n
return 0;
}
结果:
请输入任意字符串
chenlichen
chenlichen
- 1
- 2
- 3
不安全的gets
哎嘿!有个小警告挺有意思:
warning: the `gets' function is dangerous and should not be used.
- 1
用这个就可以:
fgets(str,128,stdin);//128为size
- 1
为什么?
对比get和fgets
fgets从stdin中读字符,直至读到换行符或文件结束,但一次最多读size个字符。读出的字符连同换行符存入缓冲区str中。返回指向str的指针。
而gets把从stdin中输入的一行信息存入cmd中,然后将换行符置换成串结尾符NULL。用户要保证缓冲区的长度大于或等于最大的行长。
注意gets的行为与fgets使用stdin作为参数时的行为不完全一样:首先,gets不包含结束的换行符,而fgets包含。其次,gets不允许指定要读取的字符数量的限制,因此必须小心str所指向的数组的大小,以避免缓冲区溢出。
所以呢?用fgets咯。
strcpy、strncpy —— 拷贝
char *strcpy(char* dest, const char *src);
把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
char *strncpy(char *destinin, char *source, int maxlen);
把src所指向的字符串中以src地址开始的前maxlen个字节复制到dest所指的数组中,并返回被复制后的dest
#include <string.h>
#include <stdlib.h>
int main()
{
char* strDes = (char*)malloc(128);//不开辟空间就是野指针 会出现断错误
memset(strDes,'\0',128);
char* strSrc = "clc mws";
puts(strcpy(strDes,strSrc));
memset(strDes,'\0',128);
strncpy(strDes,strSrc,3);
puts(strDes);
return 0;
}
结果:
clc mws
clc
- 1
- 2
strcmp —— 比较
extern int strcmp(const char *s1,const char *s2);
当s1<s2时,返回为负数;
当s1=s2时,返回值= 0;
当s1>s2时,返回正数。
- 1
- 2
- 3
仅做简单的示范:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[128]={'\0'};
char str2[128]={'\0'};//最快的开辟字符串空间并初始化
puts("请输入字符串1");
fgets(str1,128,stdin); //stdin标准输入
puts("请输入字符串2");
fgets(str2,128,stdin);
if(strcmp(str1,str2) == 0){
printf("一样\n");
}
else{
printf("不一样\n");
}
return 0;
}
strchr、strstr —— 检索
char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’,并且返回第一次出现字符串 needle (strchr检索的是字符)的位置,注意了,是返回第一次出现的位置,不是返回字符串needle,很多人有这个误解
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char haystack[32] = "chenlichen mei wo shuai";
char needle[32] = {'\0'};
char* ret = NULL;
//ret = (char* )malloc(32);//如果不在while中malloc,将会段错误
//ret的值是变化的,要一直动态分配空间
while(1){
ret =(char* )malloc(32);
memset(ret,'\0',32);
memset(needle,'\0',32);//而这个字符数组只需要擦除原有数据
printf("现有字符串:%s,请输入需要检索的字段\n",haystack);
//fgets(needle,32,stdin);//不明白为啥用这个一个no find
//printf("%s\n",needle);//明明这里也可以输出正常
scanf("%s",needle);
ret = strstr(haystack,needle);//这里的赋值决定了ret只能被定义为字符指针,而不是数组。
if(ret != NULL){
printf("子字符串是:%s\n",ret);
}
else{
puts("no find");
}
}
return(0);
}
运行结果:
现有字符串:chenlichen mei wo shuai,请输入需要检索的字段
chen
子字符串是:chenlichen mei wo shuai
现有字符串:chenlichen mei wo shuai,请输入需要检索的字段
wo
子字符串是:wo shuai
现有字符串:chenlichen mei wo shuai,请输入需要检索的字段
shuai
子字符串是:shuai
未解决的问题,为什么用fgets(needle,32,stdin);而不用scanf的时候,无论输入什么都是no find,用prinrf检测了,明明也正确fgets到字符串了。
现有字符串:chenlichen mei wo shuai,请输入需要检索的字段
mei
no find
现有字符串:chenlichen mei wo shuai,请输入需要检索的字段
chen
no find
现有字符串:chenlichen mei wo shuai,请输入需要检索的字段
shuai
no find
strlwr、strupr —— 大小写转换
strlwr和strupr不是标准C库函数,只能在VC中使用。linux gcc环境下需要自行定义这个函数。
如下:
#include <stdio.h>
char* strlwr(char *str)
{
if(str == NULL)
return NULL;
char *p = str;
while (*p != '\0'){
if(*p >= 'A' && *p <= 'Z')
*p = (*p) + 0x20;//大小写差32
p++;
}
return str;
}
char* strupr(char *str)
{
if(str == NULL)
return NULL;
char *p = str;
while (*p != '\0'){
if(*p >= 'a' && *p <= 'z')
*p = (*p) - 0x20;
p++;
}
return str;
}
int main()
{
char str[128] = {'\0'};
printf("请输入字符串\n");
fgets(str,128,stdin);
printf("转换为小写:%s\n",strlwr(str));
printf("转换为大写:%s\n",strupr(str));
return 0;
}
结果:
请输入字符串
niYeXiHuanJKma老哥
转换为小写:niyexihuanjkma老哥
转换为大写:NIYEXIHUANJKMA老哥
strcat —— 拼接
extern char *strcat(char *dest, const char *src);
把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”),*src中原有的字符不变。返回指向dest的指针。
要保证dest足够长,以容纳被复制进来的src。
简单的示范:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[32] = "chenlichen";
char str2[] = "meiwoshuai";
//拼接后放在str1,所以str1的长度在定义的时候必须指明并且足够大
puts(strcat(str1,str2));
return 0;
}
结果:
chenlichenmeiwoshuai
- 1
strtok —— 分割(作为重点介绍)
demo1:
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[] = "aaa bbb ccc ddd";
char c[] = " ";
char *r = strtok(s, c);
while (r != NULL) {
printf("%s\n", r);
r = strtok(NULL, c);//获取下一个串的方式比较奇葩,目标字符串改为NULL
}
return 0;
}
输出结果:
aaa
bbb
ccc
ddd
demo2:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
//字符串分割:strtok—头文件: #include <string. h>
//函数原型: char *strtok(char* str,const char* delimiters);
//参数: str: 待分割的字符串(c-string) ; delimiters: 分割符字符串。
char* p = (char*)malloc(128);
memset(p,'\0',128);
//char* p = NULL; 这样也可以 防止野指针
//char* str2 = "ni,hao,zhe,ge,shi,jie"; 这种方法不可以!!
char str2[] = "ni,hao,zhe,ge,shi,jie";
p = strtok(str2,",");
if (p == NULL) {
printf("无法分割");
}
else puts(p);
//else printf("%s",p); 两中输出方式都可以 此种输出效率更高
puts(strtok(NULL,","));//获取下一个串的方式比较奇葩,目标字符串改为NULL
puts(strtok(NULL,","));//获取下一个串的方式比较奇葩,目标字符串改为NULL
puts(strtok(NULL,","));//获取下一个串的方式比较奇葩,目标字符串改为NULL
puts(strtok(NULL,","));//获取下一个串的方式比较奇葩,目标字符串改为NULL
system("pause");
}
输出结果:
ni
hao
zhe
ge
shi
strtok容易出错的秘密
sprintf —— 最常用的带格式字符串拼接函数
#include <stdio.h>
#include <string.h>
int main(){
char s[64];
char* who = "I";
char* whom = "CSDN";
sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. " 这字符串写到s中
puts(s);
sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
puts(s);
}

四、自己实现这些API
#include<stdio.h>
#include<string.h>
void myputs(char*p) {
while (*p!='\0')
{
putchar(*p++);
}
putchar('\n');
}
int main()
{
char* p = "hello world";
puts(p);
myputs(p);
system("pause");
}
#include<stdio.h>
#include<string.h>
void mycopy(char*dest,const char*src)
{
if (dest == NULL || src == NULL)
{
return NULL;
}
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
return dest;
}
int main()
{
//char* dest = (char* )malloc(128);
//memset(dest,'\0',128);
char dest[]={'\0'}; //上面的也可以
char* src = "qwer";
mycopy(dest,src);
puts(dest);
system("pause");
}
下面这部分引用:
网址:https://blog.csdn.net/weixin_43732386/article/details/115659118
作者:糯米啊啊
1.puts
#include <stdio.h>
void myputs(char *p)
{
while(*p != '\0'){
putchar(*p++);
}
printf("\n");
}
int main()
{
char *str = "nuominuomi,qiangdeyipi";
myputs(str);
return 0;
}
2.gets
#include <stdio.h>
#include <stdlib.h>
void mygets(char *p)
{
if(p == NULL){
exit(-1);
}
while(*p = getchar()){
if(*p == '\n'){
return;//用break也可以
}else{
p++;
}
}
}
int main()
{
char str[128] = {'\0'};
printf("请输入字符串:\n");
mygets(str);
puts(str);
return 0;
}
3.mystrlen
#include <stdio.h>
#include <stdlib.h>
int mystrlen(char *p)
{
int cnt = 0;
while(*p != '\0'){
cnt++;
p++;
}
return cnt;
}
int main()
{
char *str = "qdasdqwdaddwqd";
printf("str的长度为:%d\n",mystrlen(str));
return 0;
}
4.mymemset
#include <stdio.h>
#include <stdlib.h>
int mymemset(char *p,char c,int size)
{
while(size){
*p++ = c;
size--;
}
}
int main()
{
char *str = NULL;
str = (char *)malloc(128);
mymemset(str,'a',128);
puts(str);
return 0;
}
5.mystrcpy
#include <stdio.h>
#include <stdlib.h>
char * mystrcpy(char dest[],char *src)
{
if(dest == NULL || src == NULL){
return NULL;
}
while(*src != '\0'){
*dest++ = *src++;
}
*dest = '\0';
return dest;//返回的是数组的首地址 指针的话要注意回调
}
int main()
{
char dest[128] ={'\0'};
char *src ="this is a mystrcpy test";
mystrcpy(dest,src);
puts(dest);
return 0;
}
6.strcmp
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
int mystrcmp(char *str1,char *str2)
{
assert(str1);//assert宏的原型定义在<assert.h>中
assert(str2);//其作用是如果它的条件返回错误,则终止程序执行 https://www.cnblogs.com/cpoint/p/3367326.html
while(*str1 == *str2){
if(*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
return *str1-*str2;
}
int main()
{
char *str1="hello";
char *str2="hello";
int ret = mystrcmp(str1,str2);
if(ret == 0){
printf("倆字符串相等\n");
}else if(ret > 0){
printf("字符串一比字符串二大\n");
}else{
printf("字符串一比字符串二小\n");
}
return 0;
}
7.mystrcat
#include <stdio.h>
#include <stdlib.h>
char * mystrcat(char dest[],char *src)
{
while(*dest!='\0'){//遍历到尾巴
dest++;
}
while(*src != '\0'){
*dest++ = *src++;
}
*dest = '\0';
return dest;
}
int main()
{
char dest[128] ="hello ";
char *src ="this is a mystrcat test";
mystrcat(dest,src);
puts(dest);
return 0;
}
8.字母大小写的转换
#include<stdio.h>
void main()
{
char a;
printf("请输入一个字母:");
scanf("%c",&a);
if(a <= 91) //对应ASCII表判断输入字母的ASCII值,大写字母A~Z的ASCII值为65~91
{
a = a +32; //字母a~z的ASCII值为97~123,则给该字符加32之后,他的ASCII值变为对应的小写字母的ASCII值
printf("该子母的小写形式为:%c\n",a);
}
else
{
a = a-32; //同大写变小写的ASCII值的转换
printf("该子母的大写形式为:%c\n",a);
}
}
9.输入年月日时分秒,输出该年月日时分秒的下一秒
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒
考虑如何几种情形
算法思路:
(1) 判断现在月份是大月还是小月
大月:1月,3月,5月,7月,8月,10月,12月(31天)
小月:2月(28天或者29天),4月,6月,9月,11月(30天)
(2) 2月份要判断是平年还是闰年,平年28天,闰年29天
(3) 考虑几种边界情况:
(3.1) year<0||month<1||month>12||date<1||date>31||hour<0||hour>23||minute<0||minute>59||second<0||second>60
考虑定义一个数组
Month_days[12]={31,28,31,30,31,30,31,31,30,31,30,31}
闰年时Month_days[1]=29,闰年判断条件如下:
year%400 == 0||year%100 != 0&&year%4 ==0
(3.2)
考虑下一秒的设置:
second+=1;
if(second==60)
{
second=0;
minute+=1;
if(minute==60)
{
minute=0;
hour+=1;
if(hour==24)
{
hour=0;
date+=1;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
Days=31;
break;
case 2:
if(year%400==0||year%100!=0&&year%4==0)
{
Days=29;
}
else{
Days=28;
}
break;
default:
Days=30;
break;
}
if(date>Days)
{
date=1;
month+=1;
}
if(month>12)
{
month=1;
year+=1;
}
}
}
}
}
完整代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
int NextTime(int year,int month,int date,int hour,int minute,int second)
{
int Days=0;
//首先判断输入日期格式是否正确
if(year<0||month<1||month>12||date<1||date>31||hour<0||hour>23||minute<0||minute>59||second<0||second>59)
{
cout<<"格式输入错误!!!"<<endl;
}
second+=1;
if(second==60)
{
second=0;
minute+=1;
if(minute==60)
{
minute=0;
hour+=1;
if(hour==24)
{
hour=0;
date+=1;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
Days=31;
break;
case 2:
if(year%400==0||year%100!=0&&year%4==0)
{
Days=29;
}
else{
Days=28;
}
break;
default:
Days=30;
break;
}
if(date>Days)
{
date=1;
month+=1;
}
if(month>12)
{
month=1;
year+=1;
}
}
}
}
cout<<"下一秒是"<<year<<"年"<<month<<"月"<<date<<"日"<<hour<<"时"<<minute<<"分"<<second<<"秒"<<endl;
return 1;
}
int main()
{
int YEAR,MONTH,DATE,HOUR,MINUTE,SECOND;
cout<<"请输入年份&月份&天数&小时&分钟&秒数"<<endl;
cin>>YEAR>>MONTH>>DATE>>HOUR>>MINUTE>>SECOND;
cout<<"您输入的是"<<YEAR<<"年"<<MONTH<<"月"<<DATE<<"日"<<HOUR<<"时"<<MINUTE<<"分"<<SECOND<<"秒"<<endl;
NextTime(YEAR,MONTH,DATE,HOUR,MINUTE,SECOND);
system("pause");
return 0;
}
测试用例:

10.平年闰年判断
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,y;
printf("input the year:");
scanf("%d",&y);
if (y%4 == 0)
{
if (y%100 == 0){
if (y%400 == 0)
a = 1;
else
a = 0;
}
else
a = 1;
}
else
a = 0;
if (a == 1)
printf("%d is leap year!\n",y);
else
printf("%d is common year!\n",y);
system("pause");
return 0;
}
11.输入一个日期,计算这一天是周几
#include <stdio.h>
#include <stdlib.h>
int main()
{
int unknowYear,unknowMouth,unknowday;
int knowYear=2020, knowMouth=11, knowday=2;//周一
int year=0, mouth=0, day=0;
int Day=0;
int week;
printf("请输入年 月 日:");
scanf("%d %d %d", &unknowYear, &unknowMouth, &unknowday);//输入一个数 加一个空格 完全按照输入格式输入
Day = (unknowYear - knowYear) * 360 + (unknowday - knowday) + (unknowMouth - knowMouth) * 30;
if (Day >= 0)
{
week = 1 + Day % 7;
}
else
{
week = 7 + Day % 7;
}
printf("%d\n", week);
system("pause");
return 0;
}
12.数组实现输入某年某月某日,判断这一天是这一年的第几天
#include <stdio.h>
int main()
{
int day,month,year,sum,leap;
int a[13]= {0,31,59,90,120,151,181,212,243,273,304,334};
printf("please input year month day(year month day)\n");
scanf("%d %d %d",&year,&month,&day); // 格式为:2015 12 10 2015 10 1
sum=a[month-1]+day; // 再加上某天的天数
if(year%400==0||(year%4==0&&year%100!=0)) // 判断是不是闰年
leap=1; // 是则记录为1
else
leap=0; // 不是记录为0
if(leap==1&&month>2) // *如果是闰年且月份大于2,总天数应该加一天
{
sum++;
}
printf(" %d ",sum);
printf("\n");
return 0;
}
13.itoa和atoi函数的使用和自己实现
整型数转字符,或者字符转整型数是编程中比较常见的类型转换。
itoa()函数和atoi()函数并非标准C库函数,大多数编译器的stdlib.h库中包含,如果没有的话需要自己实现。
1. itoa()
函数原型:char *itoa(int value, char *string, int radix);
- value:要转换的整型数
- string:存储字符串的数组地址
- radix:进制。2~36进制
功能及返回值:
- 将一整型数转换为字符串
- 返回指向string的指针
应用举例:
//实现2048的2-36进制输出
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int num = 2048;
char str[12]; //转换为二进制最多也才11位数字,然后转换为字符
int i;
for (i = 2; i <= 36; i++)
{
itoa(num, str, i);
printf("%s\n", str);
}
return 0;
}
函数自己实现:
- 如果库函数中不自带该函数,需要自己实现
/* 整型数转任意进制字符串 */
#include <stdio.h>
char *itoa(int value, char *string, int radix)
{
//原来的整型数可能是任意进制,如果只是十进制等就不需要定义该数组
char reserve[37] = "0123456789abcdefghijklmnopqrstuvwxyz";
char temp[100] = {0};
//错误检测
if (radix < 2 || radix > 36)
{
printf("error value\n");
return string;
}
//符号判断
int i, j, sign; //字符串计数
if ((sign = value) < 0) //负数也处理
value = -value; //转换为正数
//开始转换
i = 0;
while (value > 0)
{
temp[i++] = reserve[value%radix];
//temp[i++] = value%radix - '0'; //不行
value = value / radix;
}
//符号位
if (sign < 0)
{
temp[i] = '-';
j = i;
}
else
j = i - 1;
//逆向输出
for (; j >= 0; j--)
{
*string++ = temp[j];
}
*string = '\0'; //字符串结束符
return string;
}
int main (void)
{
int num = -2048;
char str[100]; //转换为二进制最多也才11位数字,然后转换为字符
int i;
for (i = 2; i <= 36; i++)
{
itoa(num, str, i);
printf("%s\n", str);
}
return 0;
}
结果:
-100000000000
-2210212
-200000
-31143
-13252
-5654
-4000
-2725
-2048
-15a2
-1228
-c17
-a64
-918
-800
-718
-65e
-5cf
-528
-4db
-452
-3k1
-3d8
-36n
-30k
-2ln
-2h4
-2ci
-288
-242
-200
-1t2
-1q8
-1ni
-1kw
2. atoi()
函数原型:int atoi(const char *str);
功能:将字符串转换为整型数输出
头文件:stdlib.h
返回值:
- 成功:返回整型数
- 失败:比如无法转换为int类型的值,返回0(所以无法区分转换失败还是转换本身就是0)
应用举例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str1[] = "123";
char str2[] = "-100";
printf("%d", atoi(str1) + atoi(str2));
return 0;
}
函数自己实现:
- 如果库函数中不自带该函数,需要自己实现
#include <stdio.h>
#include <ctype.h> //for isspace() or isdigit()
int isspace(int c)
{
if (c == ' ' || c == '\r' || c == '\t')
return 1;
else
return 0;
}
int atoi(char *string)
{
int integer_sign = 1;
int integer = 0;
if (string == NULL)
return 0;
//判断是否为空格/回车符/制表符
if (isspace(*string))
string++;
//判断正负号
if (*string == '-' || *string == '+')
{
if (*string == '-')
integer_sign = -1;
string++;
}
//数字字符转换成数字:可添加字母字符的转换
//while (*string >= '0' && *string <= '9')
while (isdigit(*string))
{
integer = integer * 10 + (*string - '0');
string++;
}
return integer_sign*integer;
}
int main()
{
char str1[] = "-123";
char str2[] = "a";
printf("%d", atoi(str1) + atoi(str2));
return 0;
}
结果:
-123
更多推荐



所有评论(0)