字符型数据/字符串数据
字符型数据包括字符常量和字符变量。
字符常量 -- %c char占8位
字符常量是用单引号括起来的一个字符。
例如:'a'、 'b' 、'='、'+'、 '?'
都是合法字符常量
在c语言中, 字符常量有一下特点:
1)字符常量只能用单引号括起来, 不能用双引号或其他括号。 2)字符常量只能是单个字符, 不能是字符串 3)字符可以是字符集中任意字符。 但数字被定义字符型后不能参与运算, 如5 和'5'
字符变量 ---不全等看完c plus在补充
字符变量用来存储字符常量, 即单个字符。
字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整形变量相同。
例如:
#include <stdio.h> int main(){ char ch; int len = 0; printf("Enter a message: "); ch = getchar(); while (ch != '\n'){ len++; ch = getchar(); } printf("Your message was %d character(s) long.\n", len); }
字符数组
字符串常量是由一对双引号括起来的字符序列。 "hello world"
字符串常量与字符常量的是不同的量。
区别:
1. 字符常量由单引号括起来, 字符串常量由双引号括起来。
2. 字符常量只能是单个字符, 字符串常量则可以含一个或多个字符。
3. 可以把一个字符常量赋予一个字符变量, 但不能把一个字符串常量赋予一个字符变量
4. 字符常量占一个字节的内存空间。 字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"\0",这是字符串结束标志。记住是0, 不是o, 是01的0
char s[]="dsfdsfsdf";
char s[]={'a', 'b', 'c'};
转义字符
转义字符是一种特殊的字符常量。转移字符以反斜线'\'开头, 后跟一个
或几个字符。转义字符具有特定的含义, 不同于字符原有的意义, 故称“转义”字符。
例如, 在前面各例题中printf函数的格式串中用到的"\n"就是一个转义字符, 其意义是'回车换行"。转义字符
主要用来表示那些用一般字符不便于表示的控制代码。
强制类型转换
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
(类型说明符)(表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
(float)a 把a转换成浮点型
(int)(x+y) 把x+y的结果转换为整型
在使用强制转换时应注意一下问题:
1)类型说明符和表达式都必须加括号(单个变量可以不加括号,)如把(int)(x+y)
写成(int)x+y则成为了x专场成int型之后再与y相加了
2)无论是强制转换或是自动转换, 都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不是改变数据说明时对该变量定义的类型
void main() { char a; int b; a = '1'; b = 22; printf("%f %d", (float)(b), (int)(a)); }
算数运算和表达式
% 得到余数 7 % 2 得到1
字符串
方法一:
定义字符串数组
#define STR_LEN 80 char str[STR_LEN + 1] = "abcd"; printf("%s", str);
方法二:
通过字符指针的方式:
在声明指针的适合,指向字符串字面量,不可以修改字符串字面量,数组可改。
char *a; a = "test"; printf("%s", a); /*test*/
字符串的非法操作
字符串复制 strcpy函数
原型
char *strcpy(char *s1, const char *s2);
strcpy函数把s2中的字符串复制给了字符串s1,直到遇到‘\0’;
#include <stdio.h> #include <string.h> int main(void) { char *str1 = "abcd", *str2; strcpy(str2, str1); printf("%s", str2); //abcd return 0; }
c语言字符串拼接 strcat
#include <stdio.h> #include <string.h> int main() { char a[100] = "say"; char *c = "hello"; strcat(a, c); printf("%s", a); return 0; }
为什么c语言字符串拼接不能用指针的方式呢?
为什么下面的不行呢?
strcat是没有重新申请空间的,只是直接将前面的参数的最后一个'\0'去掉,然后讲第二个参数的字符直接添上去,再在末尾补'\0',所以前面的空间至少有下str1+str2+1空间。
#include <stdio.h> #include <string.h> int main(void) { char *str1 = "hello ", *str2 = "world!!!"; strcat(str1, str2); printf("%s", str1); //abcd return 0; }
c语言字符串追加 strncat
char * strncat(char *dest, const char *src, size_t n);
解释:
把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的'\0',从而实现字符串的连接。
注意:
拼接的时候要有足够的空间
示例:
#include <stdio.h> #include <string.h> int main(){ char ch1[10] = "hello"; char ch2[5+1] = "world"; strncat(ch1, ch2, 3); printf("%s\n", ch1); //结果是:hellowor return 0; }
c语言字符串比较 strcmp
#include <stdio.h> #include <string.h> int main(void) { char *str1 = "hello adfadf", *str2 = "world!!!"; int i; i = strcmp(str1, str2); printf("%d", i); // -15,为啥我也不知道 //printf("%s", str1); //abcd return 0; }
当str1 == str2的时候结果为0
#include <stdio.h> #include <string.h> int main(){ printf("hello world!!!\n"); char *str1 = "hello", *str2 = "hello"; int i = strcmp(str1, str2); printf("%d",i); return 0; }
当str1 > str2 的时候,正数
#include <stdio.h> #include <string.h> int main(){ printf("hello world!!!\n"); char *str1 = "hello1", *str2 = "hello"; int i = strcmp(str1, str2); printf("%d",i); return 0; }
当str1 < str2 的时候, 负数
#include <stdio.h> #include <string.h> int main(){ printf("hello world!!!\n"); char *str1 = "hello", *str2 = "hello2"; int i = strcmp(str1, str2); printf("%d",i); return 0; }
c语言字符串区间比较 strncmp,高级玩法
#include <stdio.h> #include <string.h> int main(){ char a[10] = "abcdefg"; printf("%s\n", a); int i; i = strncmp(a, "abc", 3); // 意思是从a+0的地方到a+2的地方比较 printf("%d\n",
c语言求字符串长度 strlen函数
#include <stdio.h> #include <string.h> int main(void) { char *str1 = "hello world!!!"; int i; i = strlen(str1); printf("%d", i); // 14 return 0; }
字符串数组的两种写法
但是这样只适合直接创建赋值时候用;
方法一:
方法二:
字符串示例,比较不错的学习例子, 字符串数组的操作
#include <stdio.h> #include <string.h> #define MAX_REMIND 50 #define MSG_LEN 60 int read_line(char str[], int n); int main() { char reminders[MAX_REMIND][MSG_LEN + 3]; //定义二维数组, 可以输入50个样本 char day_str[3], msg_str[MSG_LEN + 1]; // 定义时间, 消息; int day, i, j, num_remind = 0; for (;;) { // 无限循环 if (num_remind == MAX_REMIND) { // 如果达到次数,break,结束不输入了 printf("--No space left --\n"); break; } printf("Enter day and reminder: "); scanf("%2d", &day); //输入天数 if (day == 0) //输入0结束 break; sprintf(day_str, "%2d", day); //强制格式化时间为字符串; // printf("day_str: %s\n", day_str); // printf("num_remind: %d\n", num_remind); read_line(msg_str, MSG_LEN); //消息和字符串,字符数组; for (i = 0; i < num_remind; i++) { if (strcmp(day_str, reminders[i]) < 0) //校验,如果转换的日期和输入的不一样,结束 break; } strcpy(reminders[i], day_str); // 复制字符串 printf("i: %s \n", reminders[i]); strcat(reminders[i], msg_str); // 合并字符串 printf("i: %s \n", reminders[i]); num_remind++; } printf("\nDay Reminder \n"); for (i = 0; i < num_remind; i++) { //最后循环打印 printf(" %s\n", reminders[i]); } return 0; } int read_line(char str[], int n) { char ch; int i = 0; while ((ch = getchar()) != '\n') { if (i < n) str[i++] = ch; } str[i] = '\0'; return i; }
c语言字符串替换,非常不错的例子
是不是和python的replace很像呀
编写名为censor的函数,用来把字符串中的出现的每一处字符“foo”
#include <stdio.h> #include <string.h> char *strrpc(char *str, char *oldstr, char *newstr); int main() { char p[] = "hello world."; printf("替换前:%s\n", p); printf("替换后:%s\n", strrpc(p, ".", "!!!")); return 0; } char *strrpc(char *str, char *oldstr, char *newstr) { char bstr[strlen(str)];//转换缓冲区 memset(bstr, 0, sizeof(bstr)); //内存重置 for (int i = 0; i < strlen(str); i++) { /*查找目标字符串, 因为需要从某str+i -->str + i + strlen(oldstr)区间的字符和oldstr进行比较*/ /*如果==0,则进行拼接*/ if (!strncmp(str + i, oldstr, strlen(oldstr))) { strcat(bstr, newstr); i += strlen(oldstr) - 1; //跳到对比字符的后面继续,这里为什么要减1呢,因为索引从0开始呀; } else { /*如果没匹配成果,则进行指定多长的字节进行拼接,这里的1是拼接一个字符*/ strncat(bstr, str + i, 1);//这里的1是size_t n,拼接几个长度 } } strcpy(str, bstr); return str; } ============================ 替换前:hello world. 替换后:hello world!!!
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。