27深入理解C指针之---字符串基础
一、字符串:是以ASCII字符NUL结尾的字符序列,NUL表示为\0
1、定义:将字符按顺序存储在数组中,以NUL结尾。
2、特征:
1)、每个字符串长度只是包含所有的字符,不包括最后的NUL,手动分配内存是需要加上NUL占用的空间1个字符
2)、使用字面量直接声明
3)、使用字符数组声明
4)、使用字符指针声明
#include <stdio.h>
#include <string.h>
#include <stdlib.h> int main(int argc, char **argv)
{
char *str1 = "Sound";
char str2[] = {'S', 'o', 'u', 'n', 'd',};
char *str3 = (char *)malloc(sizeof(char) * );
strcpy(str3, "Sound"); printf("*str1: %s\n", str1);
printf("str2[]: %s\n", str2);
printf("*str3: %s\n", str3); return ;
}
以上就是三种声明和赋值方法。
5)、不同的声明方式,实际上可以是不变的。
#include <stdio.h>
#include <string.h>
#include <stdlib.h> int main(int argc, char **argv)
{
char *str1 = "Sound";
char str2[] = {'S', 'o', 'u', 'n', 'd',};
char *str3 = (char *)malloc(sizeof(char) * );
strcpy(str3, "Sound"); printf("*str1: %s\n", str1);
printf("str2[]: %s\n", str2);
printf("*str3: %s\n", str3); //*str1 = 'L';
*str2 = 'L';
*str3 = 'L';
printf("*str1: %s\n", str1);
printf("str2[]: %s\n", str2);
printf("*str3: %s\n", str3); return ;
在早期的gcc中,第16行是可以的,在gcc 7.2中,只能16行代码是错误的,无法输出正确结果。
3、其他:
1)、初始化char数组,声明的同时进行赋值,char arrName[] = "Sound";
2)、初始化char数组,先声明再赋值,char arrName[];strcpy(arrName, "Sound");
3)、初始化char数组,先声明再赋值,char arrName[];arrName[] = {'S', 'o', 'u', 'n', 'd'};
4)、初始化char数组,先声明再一一赋值,char arrName[];arrName[0] = 'S'; arrName[1] = 'o'; arrName[2] = 'u'; arrName[3] = 'n'; arrName[4] = 'd';
5)、初始化char指针,声明的同时进行赋值,char *ptrArr = "Sound";
6)、初始化char指针,先声明,再申请空间,最后赋值,char *ptrArr; ptrArr = (char *)malloc(strlen("Sound") + 1) ;strcpy(ptrArr, "Sound");
7)、初始化char指针,先声明再一一赋值,char *ptrArr;*(ptrArr + 0) = 'S'; *(ptrArr + 1) = 'o'; *(ptrArr + 2) = 'u'; *(ptrArr + 3) = 'n'; *(ptrArr + 4) = 'd';
4、从标准输入初始化字符串:
#include <stdio.h>
#include <stdlib.h> char *getLine(){
const size_t sizeIncrement = ; //缓冲区初始化是的大小与缓冲区不够时增加的大小
size_t maximumLength = * sizeIncrement; //缓冲区最大的大小,超过此就需要增加缓冲区大小
size_t length = ; //已读入的字符数目
char *buffer = malloc(sizeof(char) * sizeIncrement); //为缓冲区初始分配的大小
char *currentPosition = buffer; //当前字符的指针
int character; //当前字符的值 //检验缓冲区是否分配成功
if(currentPosition == NULL){
return NULL;
} //通过死循环完成不停的输入时,根据需要调整大小,直至输入回车就退出
while(){
character = fgetc(stdin); //通过标准输入获取当前输入的字符值
if(character == '\n'){ //检验输入的字符是不是结束符\0
break;
}
//检验输入字符的个数是否超过了缓冲区分配的大小,根据需求实现动态调整
if(++length >= maximumLength){ //检验输入字符个数是否达到缓冲区最大值
char *newBuffer = realloc(buffer, maximumLength += sizeIncrement); //申请新的缓冲区,大小比原来的有所增大 if(newBuffer == NULL){ //检验新缓冲区是否分配成功,成功继续,否则需处理
free(buffer); //释放先前申请的缓冲区内存
return NULL; //退出函数
}
currentPosition = newBuffer + (currentPosition - buffer); //将当前指针偏置到与原来同样的位置
buffer = newBuffer; //将老指针指向新分配的内存
}
*currentPosition++ = character; //将新输入的字符存入进缓冲区
}
*currentPosition = '\0'; //退出输入后,在字符串后添加结束标志\0 return buffer; //返回最后的缓冲区的指针
} int main(int argc, char **argv)
{
char *buffer = getLine();
printf("You input: \n");
printf("%s", buffer); return ;
}
程序非常简单,加上注释,阅读应该问题不大,祝好运。
27深入理解C指针之---字符串基础的更多相关文章
- 32深入理解C指针之---字符串操作
一.字符串操作主要包括字符串复制.字符串比较和字符串拼接 1.定义:字符串复制strcpy,字符串比较strcmp.字符串拼接strcat 2.特征: 1).必须包含头文件string.h 2).具体 ...
- 30深入理解C指针之---字符串和数组
一.字符串与数组 1.定义:使用字符数组表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符数组 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用数组的一一赋 ...
- 深入理解C指针之五:指针和字符串
原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...
- 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)
目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...
- 33深入理解C指针之---通过字符串传递数据
一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...
- 31深入理解C指针之---指针和字符串
一.字符串与指针 1.定义:使用字符指针表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符指针 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用类似于数组的 ...
- 《深入理解C指针》
<深入理解C指针> 基本信息 原书名:Understanding and using C pointers 作者: (美)Richard Reese 译者: 陈晓亮 丛书名: 图灵程序设计 ...
- 理解Java中的字符串类型
1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
随机推荐
- 【转】LDA-linear discriminant analysis
分类问题也可以用降维来理解,比如一个D维的数据点x,我们可以采用下面的映射进行线性的降维, y=θTx 在计算出y后,就可以选择一个阈值h,来进行分类.正如我们在前面的PCA模型中看到的,降维会有信息 ...
- python列表之append与extend方法比较
append和extend是列表的两种添加元素方式,但这两种方式却又有些不同之处.那么不同之处在哪里呢,我们通过对二者的定义和实例来看一看. list.append() 1.定义:L.append(o ...
- python-类与继承
类的继承 什么是继承? 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类.python中,父类.子类(派生类)只有在继承的时候才会产生. 继承的特性:子类会继承父类所有的属性. 为什么要用 ...
- DP刷题记录(长期更新)
bzoj 2748 一个吉他手,有一个初始音量,有一个音量最大值max. 给定n个音量变化量,从第一个变化量开始,可以选择加上或者减去变化量.途中音量不能低于0,不能超过max. 求最后能达到的最大音 ...
- pidgin中使用QQ
安装 实现的功能: 可以发送静态表情 可以发送动态表情 可以发图片? 可以添加好友 可以添加群?
- 反射的妙用-类名方法名做参数进行方法调用实例demo
首先声明一点,大家都会说反射的效率低下,但是大多数的框架能少了反射吗?当反射能为我们带来代码上的方便就可以用,如有不当之处还望大家指出 1,项目结构图如下所示:一个ClassLb类库项目,一个为测试用 ...
- 修改DB-LINK连接数方法
原因分析有可能是DB-LINK连接数的限制,请做如下修改验证: 以oracle用户登录数据库节点. 连接数据库. $ sqlplus "/as sysdba"修改DataBase ...
- 01_Java 软、弱引用语法介绍
文章导读: 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用, 本章内容介绍了Reference的概 ...
- python学习-- {% csrf_token %}
1.不推荐禁用掉django中的CSRF. 2.我们可以再html页面的form表单中添加csrf_token,带着表单的请求一起发送到服务器去验证. <form enctype=" ...
- [uiautomator篇][9]遇到问题
1 (1) 修改apk的存储权限,不要创建文件会提示:文件找不到 (2) 退出应用 mDevice.executeShellCommand("am force-stop com.antutu ...