字符
字符:
字符就是符号或图案,在c代码是以整数形式模的,当需要显示时再根据ASCII 表的对应关系显示出响应的符号或者图案。
‘ 0 ’ 48
‘ A ' 65
’ a ‘ 97
’ \0 ‘ 0
关于字符的函数:
头文件都是 #include <ctype.h>
int isalnum( int ch );
功能:如果参数是数字或字母字符,函数返回非零值,否则返回零值。
int isalpha( int ch );
功能:如果参数是字母字符,函数返回非零值,否则返回零值。
int isdigit( int ch );
功能:如果参数是0到9之间的数字字符,函数返回非零值,否则返回零值.
int islower( int ch );
功能:如果参数是小写字母字符,函数返回非零值,否则返回零值。
int isupper( int ch );
功能:如果参数是大写字母字符,函数返回非零值,否则返回零值。
int isxdigit( int ch );
功能:如果参数是十六进制数字字符(即:A-F, a-f, 0-9),函数返回非零值,否则返回零值。
字符串:
由字符组成的串型结构,结束标志是 ' \0 '。
串型结构:
由相同的类型的数据组成,有一个确定的结束标志,对数据的处理是连续的直到遇见结束标志为止。
字符串字面值:
1. 由“双引号包含的若干个字符”,存储在代码段,以地址形式呈现
2. 末尾有隐藏的‘ \0 ',使用sizeof对字符串字面值进行计算可以看出
3. 虽然以地址形式呈现,但他是与数组名相应的地址,所以是以sizeof计算出的是字符数量+1,而不是4
4. 可以用const char* 指针变量存储他们的地址,长期使用。不可以强行修改不然会有段错误产生,不可以修改代码段。汉字在Windows2字节,在linux里是3个字节。
5. 相同的字符串字面值在代码当中只存一份。
字符数组:
- 只要有' \0 '结尾 ,字符数组可以当做字符串使用
- 如果没有‘ \0 ' ,把字符数组当做字符串使用,可能出现乱码,可能出现段错误
- 可以使用字符串字面值给字符数组初始化,不需要设置数组的长度,编译器会自动计算,并且会给'\0'自动预留数据
- 字符数被初始化完成后,程序中就有了两份相同的字符串,一份在代码段(只能读不能写),另一份在栈内存(可读可写)。
字符串的输入:
-
scanf
占们符%s,char*地址,scanf函数会自动在末 尾存储一个’ \0 ‘.
scanf遇到空格就停止,无法接受带空格的字符 串。
scanf不负责所输入字符的长度,直到遇见enter键才会停止,当超出存储空间的范围时,可能产生段错误
注意:可以在scanf之前输入getch()来删除缓冲区的值
-
char *gets(char *s);
专门用来接受字符串的函数,可以接受带空格的字符串
gets也不能限制所输入的字符串长度,也可能会产生段错误
-
char *fgets(char *s, int size, FILE *stream);
该函数可以从指定的文件中读取不超过size-1个字符,当达到size-1个字符时自动停止,他会强行为‘\0’预留位置。
如果输入的字符不足size-1个会连\n一起接收。
如果输入的字符超过size-1个,剩余的属于会残留在缓冲区中会影响后续的数据的输入
解决办法:
stdin->_IO_read_ptr = stdin->_IO_read_end;
终端是一个特殊的文件 stdin
封装上面的fgets函数
#include<string.h> char* get_str(char* str ,size_t size) { fgets(str,size,stdin); size_t len = strlen(str); if('\n' == str[len-1]) { str[len-1] = '\0'; } else { stdin->_IO_read_ptr = stdin->_IO_read_end; } return str; }
字符串的输出:
printf "%s" 输出字符串
int puts(const char *s);
功能:输出字符串,会自动添加一个'\n'
返回值:输出的字符个数对字符串操作:
标准库中的string.h函数几乎都是处理字符串的函数,常用的有:
size_t strlen(const char *s);
功能:计算字符串的长度,不包含'\0'
char *strcpy(char *dest, const char *src);
功能:拷贝字符串,相当于普通变量的赋值语句。
char *strcat(char *dest, const char *src);
功能:把字符串src追加到dest的末尾,相当于普通变量的 +=。
int strcmp(const char *s1, const char *s2);
功能:按照字典序,比较两个字符串,谁在前谁小。
s1 > s2 返回 正值
s1 < s2 返回 负值
s1 == s2 返回 0
注意:以上四个函数要求能够手写。char *strncpy(char *dest, const char *src, size_t n);
功能:从src拷贝n个字符到destchar *strncat(char *dest, const char *src, size_t n);
功能:从src拷贝n个字符追加到dest字符串的末尾int strncmp(const char *s1, const char *s2, size_t n);
功能:按照字典序比较字符s1和s2,只比较前n个字符char *strchr( const char *str, int ch );
功能:在str中查找字符ch首次出现位置,如果找不到返回NULLchar *strstr( const char *str1, const char *str2 );
功能:在str1中查找字符串str2首次出现的位置,如果找不到返回NULLint atoi(const char *nptr);功能:把字符串转换成int类型整数
long atol(const char *nptr);
功能:把字符串转换成long类型整数long long atoll(const char *nptr);
功能:把字符串转换成long long类型整数作业:
1、实现一个函数把整数转换成字符串
char* itoa(char* str,int num);
2、实现一个函数把字符串单词首字母转换成fcha大写,字符串中空格转换成 %_%。空格键替换
判断首单词的大小写
3、实现一个函数把字符串中的单词逆序。
modifying one node will also change the other
other the change also will node one modifying
4、实现两个超大整数的相加。
附加题:实现一个检查身份证号是否合法的程序。