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的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
随机推荐
- 【数论分块】bzoj2956: 模积和
数论分块并不精通……第一次调了一个多小时才搞到60pts:因为不会处理i==j的情况,只能枚举了…… Description $\sum_{i=1}^{n}\sum_{j=1 \land i \not ...
- 【整理】虚拟机和主机ping不通解决办法,虚拟机ping不通外网的解决方法
检查几个方面: 1.检查虚拟网卡有没有被禁用2.检查虚拟机与物理机是否在一个VMNet中3.检查虚拟机的IP地址与物理机对应的VMNet是否在一个网段4.检查虚拟机与物理机的防火墙是否允许PING, ...
- Python模块(三)(正则,re,模块与包)
1. 正则表达式 匹配字符串 元字符 . 除了换行 \w 数字, 字母, 下划线 \d 数字 \s 空白符 \n 换行符 \t 制表符 \b 单词的边界 \W \D \S 非xxx [ ...
- LeetCode(128) Longest Consecutive Sequence
题目 Given an unsorted array of integers, find the length of the longest consecutive elements sequence ...
- SDUSToj第十一次作业源代码格式问题
Problem I: 源代码的格式 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1471 Solved: 634 [Submit][Status][W ...
- bash之条件测试if/else
bash之条件测试: if/then结构 条件测试(CONDITION): test EXPRESSION:测试条件表达式正确否 [ EXPRE ...
- Monkey与MonkeyRunner之间的区别
为了支持黑盒自动化测试的场景,Android SDK提供了monkey和monkeyrunner两个测试工具,这两个测试工具除了名字类似外,还都可以向待测应用发送按键等消息,往往容易产生混淆,以下是他 ...
- 使用Blend的一些问题和技巧
WPF开发,界面处理首选Blend,如果你开发了两年WPF都没接触过blend(当然这种几率不高),或者你刚接触WPF,可以考虑使用Blend,这货也算得上一个神器,上手也不难.以下有两位讲得不错,大 ...
- 新线程 handler
class CalculateThread extends Thread { private Handler handler; @Override public void run() { super. ...
- Hive安装步骤
首先解压压缩包 然后进入bin 执行 ./hive 不过现在hive使用的是自己默认的数据库,不方便,可以通过配置使用MySQL数据库 创建hive-site.xml 粘贴一下内容 <confi ...