C语言里所有文字信息必须记录在一组连续的字符类型存储区里
所有文字信息必须以字符'\0'做结尾,这个字符的ASCII码就是0
符合以上两个特征的内容叫字符串,它们可以用来在程序里记录文字信息.字符串里'\0'字符前面的部分是有效文字信息,所有字符串都可以用字符类型指针表示

字符串字面值是一种字符串,用一对双引号中间的一组字符表示(例如"abc","#@%#@%"等).编译器在编译的时候自动在字符串字面值的末尾加上'\0'字符.编译器会把字符串字面值替换成第一个字符所在存储区的地址.字符串字面值的内容在程序执行过程中不可以修改,内容一样的字符串字面值其实是同一个,多个并列的字符串字面值会被合并成一个

字符数组也可以用来存放字符串,只有包含'\0'字符的字符数组里才能记录字符串,可以用字符串字面值对字符数组进行初始化,这个时候计算机会把字符串字面值里的所有字符(包括'\0'字符)都复制到字符数组里,字符数组里的字符串内容可以修改

printf函数可以把一个字符串里所有有效字符显示在屏幕上,这个时候要使用%s作为占位符

/*
* 字符串演示
* */
#include <stdio.h>
int main() {
char str[] = "abcdef";
printf("%p\n", "abc");
printf("%p\n", "abc");
printf("%p\n", "ab""c");
printf("%c\n", *"abc");
printf("%d\n", *("abc" + 3));
//*"abc" = 'x'; 错误
printf("sizeof(str)是%d\n", sizeof(str));
printf("%s\n", "abcdef");
return 0;
}

不可以在程序里用操作符对字符串进行操作,C语言里提供一组标准函数用来操作字符串,为了使用这些标准函数需要包含string.h头文件

strlen 统计字符串里有效字符个数
strcat 把两个字符串合并成一个,第一个参数必须是放在字符数组里的字符串,这个函数有可能修改不属于数组的存储区,这可能造成严重错误
strncat 这个函数功能和strcat类似,但是可以避免strcat的问题
strcmp 用来比较两个字符串的大小,根据ASCII码比较大小,如果返回值是1表示前一个字符串大,如果返回值是-1表示后一个字符串大,如果返回值是0表示一样大
strncmp 比较两个字符串的前n个字符
strcpy 把一个字符串复制到字符数组里,这个函数有可能修改不属于数组的存储区,这可能造成严重错误
strncpy 功能和strcpy类似,但是可以只拷贝,字符串里前n个字符,有可能不复制'\0'字符
memset 用来把一个字符数组里前n个存储区的内容设置成某一个字符
strstr 用来在一个大字符串里查找某个小字符串所在的位置,如果找不到则返回值NULL

/*
* 字符串演示
* */
#include <stdio.h>
#include <string.h>
int main() {
char str[10] = "abc";
printf("有效字符个数是%d\n", strlen(str));
printf("sizeof(str)是%d\n", sizeof(str));
printf("%s\n", strcat(str, "xyz"));
printf("%s\n", str);
printf("比较结果是%d\n", strcmp("abc", "abd"));
printf("%s\n", strcpy(str, "xyz"));
printf("%s\n", str);
memset(str, 'h', 9);
printf("%s\n", str);
printf("%s\n", strstr("abcdefghijklmn", "def"));
return 0;
}

以下两个字符串相关的函数不需要包含string.h头文件
  sprintf 按照格式把多个数字合并成一个字符串并记录到字符数组里
  sscanf 按照格式从字符串里获得多个数字并记录到存储区里

/*
* 字符串函数演示
* */
#include <stdio.h>
int main() {
char str[20] = {0};
char ch = 0;
int num = 0;
float fnum = 0.0f;
//printf("%d %g %c\n", 45, 6.5f, 't');
sprintf(str, "%d %g %c\n", 45, 6.5f, 't');
printf("%s", str);
//scanf("%c%d%g", &ch, &num, &fnum);
sscanf("p 34 6.5", "%c%d%g", &ch, &num, &fnum);
printf("%d %g %c\n", num, fnum, ch);
return 0;
}

以下两个函数可以把字符串里的数字转换成数字类型,为了使用这两个函数需要包含stdlib.h头文件

  atoi 用来把字符串开头部分的整数转换成整数类型

  atof 用来把字符串开头部分的浮点数转换成双精度浮点类型

在scanf标准函数里使用%s做占位符可以把用户在键盘上输入的字符串记录到字符数组里,这种方法可能造成严重错误

fgets函数也可以从键盘得到一个字符串并记录到字符数组里,这个函数可以避免scanf函数的问题,这个函数需要三个参数
  1.数组名称
  2.数组里存储区个数
  3.用stdin表示键盘

/*
* 字符串演示
* */
#include <stdio.h>
#include <string.h>
int main() {
char str[10] = {0};
printf("请输入一个字符串:");
//scanf("%s", str);
fgets(str, 10, stdin);
if (strlen(str) == 9 && str[8] != '\n') {
scanf("%*[^\n]");
scanf("%*c");
}
printf("%s\n", str);
printf("请输入一个字符串:");
//scanf("%s", str);
fgets(str, 10, stdin);
printf("%s\n", str);
return 0;
}

如果输入内容不能充满数组就把用户最后输入的回车当作'\n'字符也放到数组里.如果输入的内容超过数组里存储区的数量就只会把,输入内容的前面部分放到数组里,后面的部分当作下一个字符串等以后读取.应该在每次使用fgets函数获得字符串以后清理掉输入缓冲区里可能存在的多余数据.应该把清理语句放在一个分支里,分支要保证输入缓冲区里有多余的数据

标准C语言(9)的更多相关文章

  1. 关于标准C语言的预定义宏【转】

    标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__  当 ...

  2. 【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析

    零. 优先级    在C++ Primer一书中,对于运算符的优先级是这样描述的:     Precedence specifies how the operands are grouped. It ...

  3. 标准SQL语言的用法

    原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...

  4. 关于标准C语言的预定义宏

    标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__  当前 ...

  5. UML标准建模语言与应用实例

    一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...

  6. UML(统一建模语言)是通用的可视化标准建模语言。由构造块、公共机制、构架三部分组成。

    UML UML(统一建模语言)是通用的可视化标准建模语言.由构造块.公共机制.构架三部分组成. 1.构造块:包括基本的UML建模元素(类.接口.用例等).关系(关联关系.依赖关系.泛化关系.实现关系) ...

  7. 标准C 语言总结

    ***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...

  8. 标准C语言(1)

    C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...

  9. 【M35】让自己习惯于标准C++语言

    1.最近一些年C++语言增加的特性有: a.RTTI,namespace,bool,关键字mutable和explicit,enums,以及const static int可以直接初始化. b.扩充了 ...

  10. 标准C语言的输入输出流(i/o)方法详解

    cppreference.com -> 标准 C I/O ->详细说明 标准 C I/O clearerr 语法: #include <stdio.h> void cleare ...

随机推荐

  1. 提交SVN Working copy locked解决

    今天一大早提交SVN的时候,出现这个错误: 百度了一下原因:因为我强制在commit的时候退出了,导致svn项目文件被锁了,不能commit,不能update了 赶紧百度了一下解决办法: http:/ ...

  2. pm2 代替 Supervisor 管理进程

    前提 我们在使用 Laravel 的时候不免用到列队来处理任务,而 Laravel 官方文档给出的是 Supervisor 来管理进程和监控.但是我们在使用中有下面几个缺点: Supervisor 单 ...

  3. python学习之那些你不在乎却操作非主流的练习题(一)

    1.写代码,有如下列表,按照要求实现每⼀个功能 lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt ...

  4. python笔记之列表

    python中列表使用list类. 创建一个列表:list1 = [1,2,3,4]使用逗号隔开每个元素,使用方括号包含起来,创建空列表直接使用list2 = [] #!/usr/bin/env py ...

  5. TCP和SSL TCP应用

    TCP和SSL TCP应用 对于普通开发者而言编写TCP应用通讯是一件相对复杂的工作,毕竟需要一系列的bytes操作:如果再针对SSL的安全性处理相信会把很多普通开发者拒之门外.为了简化这一问题Bee ...

  6. sqlalchemy的join使用

    ——.先看mysql的join链接方法 #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Floa ...

  7. Azure Blob 存储简介

    Azure Blob 存储是 Microsoft 提供的适用于云的对象存储解决方案. Blob 存储最适合存储巨量的非结构化数据. 非结构化数据是不遵循特定数据模型或定义(如文本或二进制数据)的数据. ...

  8. PTA(Basic Level)1006.Sign In and Sign Out

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  9. python多线程学习(一)

    python多线程.多进程 初探 原先刚学Java的时候,多线程也学了几天,后来一直没用到.然后接触python的多线程的时候,貌似看到一句"python多线程很鸡肋",于是乎直接 ...

  10. 使用HTMLTestRunner生产报告

    HTMLTestRunner下载安装及用法 1. 说明 HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展.它生成易于使用的 HTML 测试报告 本文针对Pyt ...