五大板块(5)——字符串

参考:五大板块(5)——字符串
作者:丶PURSUING
发布时间: 2021-03-18 16:03:48
网址:https://blog.csdn.net/weixin_44742824/article/details/114982019

目录

  • 一、字符串的定义方式与输出
  • 二、字符串的结尾是 ’ \0 ’
    • 所以用strlen计算有效字符的长度
    • strlen使用(1)注意字符数组当做字符串来用?
  • 三、字符串操作常用API
    • puts、gets —— 输入与输出
      • 不安全的gets
      • 对比get和fgets
    • strcpy、strncpy —— 拷贝
    • strcmp —— 比较
    • strchr、strstr —— 检索
    • strlwr、strupr —— 大小写转换
    • strcat —— 拼接
    • strtok —— 分割(作为重点介绍)
      • strtok容易出错的秘密
    • sprintf —— 最常用的带格式字符串拼接函数
  • 四、自己实现这些API
    • 1.puts
    • 2.gets
    • 3.mystrlen
    • 4.mymemset
    • 5.mystrcpy
    • 6.strcmp
    • 7.mystrcat
    • 8.字母大小写的转换
    • 9.输入年月日时分秒,输出该年月日时分秒的下一秒
    • 10.平年闰年判断
    • 11.输入一个日期,计算这一天是周几
    • 12.数组实现输入某年某月某日,判断这一天是这一年的第几天
    • 13.itoa和atoi函数的使用和自己实现

一、字符串的定义方式与输出

#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);//输出方式三:调用字符串APIputs(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计算有效字符的长度

在很多场景,我们都需要在程序的执行过程中录入字符串,如下:

#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);//内置了一个\nreturn 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;//大小写差32p++;}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,","));//获取下一个串的方式比较奇葩,目标字符串改为NULLputs(strtok(NULL,","));//获取下一个串的方式比较奇葩,目标字符串改为NULLputs(strtok(NULL,","));//获取下一个串的方式比较奇葩,目标字符串改为NULLputs(strtok(NULL,","));//获取下一个串的方式比较奇葩,目标字符串改为NULLsystem("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.htmlwhile(*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;elsea = 0;}elsea = 1;}    elsea = 0;if (a == 1)printf("%d is leap year!\n",y);elseprintf("%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 1sum=a[month-1]+day; // 再加上某天的天数if(year%400==0||(year%4==0&&year%100!=0))  // 判断是不是闰年leap=1; // 是则记录为1elseleap=0; // 不是记录为0if(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;}elsej = 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;elsereturn 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈尔滨阳光计算机学院是不是黄了,黑龙江这4所野鸡大学,常被误认为是名校,实则害人不浅...

在高考中拿到高分进入心仪的大学&#xff0c;几乎是所有高三党奋斗努力的目标。但并不是所有的考生都能得偿所愿&#xff0c;没有取得高分&#xff0c;想进入好大学&#xff0c;但是又不想复读再经历一次高三的磨砺。如果此时你收到了录取通知书或者电话&#xff0c;告知你被一…

android 打开支付宝扫码页_Chrome 85正式版发布:新增标签页分组功,网页多了也不乱...

IT服务圈儿有温度、有态度的IT自媒体平台文章转载自 OSCHINA 社区[http://www.oschina.net]原文标题&#xff1a;Chrome 85 稳定版发布&#xff0c;页面加载速度提升 10%谷歌今日发布了最新稳定版 Chrome 85。此版本将页面加载速度提高了 10%&#xff0c;并带来了许多标签页方面…

Windows使用技巧

摘自&#xff1a;这些技巧让你windows用起来很爽 —— 小工具&#xff0c;小技巧&#xff0c;删小广告&#xff0c;重装卸载残留 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-12 16:09:17 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/detail…

iOS开发缓存机制之—内存缓存机制

在IOS应用程序开发中&#xff0c;为了减少与服务端的交互次数&#xff0c;加快用户的响应速度&#xff0c;一般都会在iOS设备中加一个缓存的机制。这篇文章将介绍一下如何在iOS设备中进行缓存&#xff0c;本文先介绍一下将内容缓存到内存中&#xff0c;下一篇文章就介绍一下在i…

云计算机教室怎么布线,云和县实验小学计算机教室综合布线及计算机安装预算方案.doc...

云和县实验小学计算机教室综合布线及计算机安装预算方案.doc (2页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;17.90 积分&#xfeff;云和县教育装备和勤工俭学办公室计算机教室改造工程参数设备名…

循环造数据_项目管理数据与信息--DIKW模型

开头的话在PMP中&#xff0c;有一块内容是“项目管理数据与信息&#xff1a;工作绩效数据&#xff08;Work Performance Data&#xff09;&#xff0c;工作绩效信息&#xff08;Work Performance Information&#xff09;&#xff0c;工作绩效报告&#xff08;Work Performance…

基于C语言Ncurse库和链表的简单贪吃蛇小游戏

参考&#xff1a;基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者&#xff1a;三速何时sub20 发布时间&#xff1a;2020-09-29 10:23:51 网址&#xff1a;https://blog.csdn.net/weixin_44234294/article/details/108829135?spm1001.2014.3001.5501 Ncurses库相关介绍 ncurse…

C 内存分配【转】

c 内存分配 1、程序代码区:存放函数体的二进制代码。 2、全局区数据区&#xff1a;全局数据区划分为三个区域。 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域&#xff0c;未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数…

STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结

摘自&#xff1a;STM32F103五分钟入门系列&#xff08;一&#xff09;跑马灯&#xff08;库函数寄存器&#xff09;加编程模板GPIO总结 作者&#xff1a;自信且爱笑‘ 发布时间&#xff1a; 2021-04-28 21:17:40 网址&#xff1a;https://blog.csdn.net/Curnane0_0/article/det…

计算机没有程序,计算机小知识:想尝试写程序却没有电脑?这个在线编辑器满足你...

大家好&#xff0c;我是零一&#xff0c;昨天的文章《计算机小知识&#xff1a;手把手教你写出自己的第一个程序&#xff1a;Hello World》发表后&#xff0c;没几分钟就有小伙伴问我&#xff0c;没有电脑&#xff0c;但是真的很想尝试去学习一下编程&#xff0c;应该怎么办&am…

微信小程序时间戳的转换及调用

13位 的时间戳&#xff0c;如下图&#xff1a; 效果图: 1.(utils.js里面的代码): function formatTime(timestamp, format) {const formateArr [Y, M, D, h, m, s];let returnArr [];let date new Date(timestamp); //13位的时间戳, 如果不是13位的, 就要乘1000,就像这样…

基于Wemos D1的感应开盖垃圾桶

参考&#xff1a;基于Wemos D1的感应开盖垃圾桶&#xff08;增加自己的代码实现部分&#xff09; 作者&#xff1a;LEO-max 发布时间&#xff1a;2020-12-29 15:21:26 网址&#xff1a;https://blog.csdn.net/zouchengzhi1021/article/details/111880104?spm1001.2014.3001.55…

电脑计算机主板不启动,电脑主板不能启动的解决方法

电脑主板不能启动的解决方法主板又称主机板、系统板、逻辑板、母板、底板等&#xff0c;是构成复杂电子系统例如电子计算机的中心或者主电路板。下面给大家介绍电脑主板不能启动的解决方法&#xff0c;欢迎阅读!电脑主板不能启动的解决方法电脑主板不能启动的解决方法一&#x…

WEB前端 CSS(非布局)

目录 WEB前端 CSSCSS引入方式CSS结构CSS选择器直接选择器组合选择器分组选择器 也叫并集选择器属性选择器伪类选择器伪元素选择器CSS选择器是一个查找的过程&#xff0c;高效的查找影响页面加载的效率CSS选择器的优先级CSS声明CSS非布局声明CSS布局声明除了css 对样式有影响&am…

二叉树的三叉链表存储和基本操作

三叉链表存储表示 改进于二叉链表&#xff0c;增加指向父节点的指针&#xff0c;能更好地实现结点间的访问。 存储结构 /* 二叉树的三叉链表存储表示 */typedef struct BiTPNode{TElemType data;struct BiTPNode *parent,*lchild,*rchild; /* 双亲、左右孩子指针 */}BiTPNode,*…

麟龙指标通达信指标公式源码_通达信指标公式源码单阳不破主图指标公式

做价值的传播者&#xff0c;一路同行&#xff0c;一起成长问题&#xff1a;怎样才能每天都收到这类文章&#xff01;答案&#xff1a;只需点击上方《通达信公式指标》{通达信单阳不破}MA30: MA(C,30 ),COLORGREEN;MA30_: IF(MA30>REF(MA30,1),MA30,DRAWNULL),COLORMAGENTA;阳…

高考英语口语测试软件,练习英语口语的app有哪些

随着国际化的发展&#xff0c;英语越来越普遍。英语中口语也是很重要的成分之一。也是跟老外交流或者英语考试的重要考点之一。我们有很多方法锻炼口语。什么方法最快捷最有效方便&#xff1f;下面我们看看几款最受欢迎的英语口语练习app。练习口语的app1、口语侠一款非常实用的…

chkconfig命令会立即生效吗_UG绘制波纹管,整体变形命令你会用吗?

最近又有小伙伴问我波纹管怎么画了&#xff0c;这个以前教过大家&#xff0c;文章名字叫饮料吸管和排水管&#xff0c;看来这个名字不够专业&#xff0c;大家找不到啊&#xff0c;今天就来重新绘制一个&#xff0c;用一个新的方法&#xff0c;大家来额外学习一下&#xff0c;了…

C语言入门日记

参考&#xff1a;C语言入门日记 作者&#xff1a;9art0 发布时间&#xff1a;2020-08-30 16:37:46 网址&#xff1a;https://blog.csdn.net/GatoWong/article/details/108307915?spm1001.2014.3001.5501 C语言入门日记1.1.C语言搭建及system函数1.2.C语言的基础框架解释1.3.C程…

测试电视是不是4k的软件,怎么判断4K电视真假?教你快速检测的方法!

原标题&#xff1a;怎么判断4K电视真假?教你快速检测的方法!4K电视从进入市场之后一直都受到企业的力捧&#xff0c;随着电视企业对4K电视的大力度宣传和消费环境的逐渐成熟&#xff0c;越来越多的消费者开始认可4K电视&#xff0c;并在购机时表明首选4K电视。4K电视顾名思义就…