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的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
随机推荐
- iOS中的数据存储方式_SQLite3
优点: 1) SQLite是一款轻型的嵌入式数据库; 2) 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 3) 它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还 ...
- 简单的Datable转List方法
public static class DataTableUtils<T> where T : new() { public static List<T> ConvertToM ...
- html5新结构标签
html5新结构标签 <header> 定义 section 或 page 的页眉,也就是定义头部的标签. <footer> 定义 section 或 page 的页脚. & ...
- 【Git版本控制】Git的merge合并分支命令
1.实例 git checkout master git merge dev merge合并分支只对当前分支master产生影响,被合并的分支dev不受影响. 假设你有两个分支,“stable” 和 ...
- day2-python 登录
# username = 'niuhanyang' # 写一个判断登录的程序: # 输入: username # password # 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 ...
- 15.Yii2.0框架where单表查询
目录 新建控制器 HomeController.php 新建model article.php 新建控制器 HomeController.php D:\xampp\htdocs\yii\control ...
- 《linux设备驱动开发详解》笔记——12linux设备驱动的软件架构思想
本章重点讲解思想.思想.思想. 12.1 linux驱动的软件架构 下述三种思想,在linux的spi.iic.usb等复杂驱动里广泛使用.后面几节分别对这些思想进行详细说明. 思想1:驱动与设备分离 ...
- HDU - 6199 gems gems gems (DP)
有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...
- /dev/sda is apparently in use by the system; will not make a filesystem here!解决方法
/dev/sda is apparently in use by the system; will not make a filesystem here! 翻译:系统显然在使用,不会在这里做文件系统 ...
- JAVA-基础(四) Aarryas 数组
1. asList( )方法 返回一个被指定数组支持的List.换句话说,列表和数组访问的是同一个 单元.它具有如下的形式: static List asList(Object[ ] array) 2 ...