C/C++第十天——标准C字符

| 阅读:675 发表时间:2017-09-03 22:46:30 C语言

c语言中所有文字信息必须记录在一组连续的字符类型存储区里

C语言里规定所有的文字信息必须一特定的字符’\n‘作为结尾,(这个字符串的

ASCII码就是数字0)

符合以上两个特征的内容叫做字符串'\0'字符串前的的内容是有效文字内容

所有字符串可以用一个字符类型的指针表示

字符串字面值是一个字符串,双引号中间的一组字符串表示,例如"@#%sdg","sdg"

编辑器会自动在最后加上'\0'字符

编辑器会把字符串字面值替换成第一个字符地址

字符串字面值里的所有字符串在程序运行过程中不能修改

多个内容一样的字符串字面值其实是同一个

多个并列写在一起的字符串字面值会被自动合并

#include<stdio.h>

int main() {

char *p_str = "abcdef",*p_str1 = "abcdef",*p_str2 = "abc""def";

printf("p_str是%p",p_str1是%p\n",p_str,p_str1,p_str2);

return 0;

}

字符数字也可以表示字符串

程序中要保证字符数组中包含的'\0'字符,否则字符数组不能作为字符串使用

可以使用字符串字面值对字符数组进行初始化,初始化的时候会把字符串字面值里的’\0‘字符也放到字符数组里

用字符串字面值对字符串数组初始化完成后他们的存储关系完全无关

字符数组里的字符串可以修改

不可以使用操作符对字符串进行操作,而应该使用一组函数

为了使用这个函数需要包含string.h文件

strlen 用来统计字符串中有效字符的个数

与sizeof关键字不同

备注:在linux中可以使用man函数,例如man strlen

strcat 合并两个字符串,追加到末尾

strcat(str,"xyz"),%s打印字符串

有可能会修改数组外存储区这会导致严重错误

strncat 功能和strcat类似,可以避免出现问题

strcmp 比较两个字符串的大小

strncmp 只比较两个字符串里前n个字符

strcpy 把一个字符串复制到另外一个字符串数组里

有可能修改不属于数组的存储区,这会导致错误

strncpy 功能可strcpy了;类似,可以避免发生错误

memset 可以把字符串数组中所有字符存储区填写同一个字符数据

strstr 在一个字符串中查找另一个字符串的位置

其他操作字符串操作函数

sprintf(); 按照格式把数据打印在字符数组中

sscanf 从字符串中得到数据并记录在变量里

atoi 把字符串里的整数转换成整数类型

atof 把字符串里的浮点数转成浮点类型

以上两个函数需要使用 stdlib.h文件

练习:

1.编写函数实现和strlen一样的功能

#include<stdio.h>

int mystrlen(const char *p_str) {

const char *p_tmp = p_str;

int cnt = 0;

while(1) {

if(*p_tmp) {

cnt++;

}else {

break;

}

p_tmp++;

}

return cnt;

}

int main () {

int num = mystrlen("abcdef");

printf("有效字符个数是%d\n",num);

}

2.编写程序从键盘得到一组开始成绩,成绩个数不多于10个(当用户输入小于0时停止输入)

把这些考试成绩按照如下格式拼凑成一个字符串23,76,93,27

然后把字符传打印在屏幕上,把字符串里所有的考试成绩求和打印在屏幕上

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main() {

char ranks[50] = {},rank[10] = {};

int num = 0;

int sum = 0;

char *p_ch = NULL;

while(1) {

printf("请输入一个成绩:");

scanf("%d",&num);

if(num <= 0) break;

sprintf(rank,"%d",num);

strcat(ranks,rank);

strcat(ranks,",");

}

ranks[strlen(ranks) - 1] = 0;

printf("字符串是%s\n",ranks);

p_ch = ranks;

while(1) {

sum += atoi(p_ch);

p_ch = strstr(p_ch,",");

if(!p_ch) {

break;

}

p_ch ++;

}

printf("总成绩是%d\n",sum);

return 0;

}

在printf函数调用语句里用%s做占位符就可以把一个字符串打印在屏幕上

可以使用scanf函数从键盘得到一个字符串并把它记录在一个数组里(这个时候要使用%s作为占位符)

如果输入内容中有空格则只能得到空格前的部分

如果输入内容超过数组容量则会出现严重错误

fgets函数也可以用来从键盘得到字符串并记录到一个数组里

这个函数需要三个参数

1.数组名称

2.数组中存储区的个数

3.stdin表示键盘

如果输入的字符个数不够则会把最后输入的回车当做'\n'字符也可以放到数组里

如果输入的过多则只会截取前面的部分,下次读取字符串的时候会从后面没有处理的内容读取

应该在每次使用fgets函数获得字符串以后把可能存在的垃圾数据清理掉

清理语句应该放在一个分支里,只有有垃圾数据时才会清理

热门推荐