一、字符串:是以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指针之---字符串基础的更多相关文章

  1. 32深入理解C指针之---字符串操作

    一.字符串操作主要包括字符串复制.字符串比较和字符串拼接 1.定义:字符串复制strcpy,字符串比较strcmp.字符串拼接strcat 2.特征: 1).必须包含头文件string.h 2).具体 ...

  2. 30深入理解C指针之---字符串和数组

    一.字符串与数组 1.定义:使用字符数组表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符数组 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用数组的一一赋 ...

  3. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  4. 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)

    目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...

  5. 33深入理解C指针之---通过字符串传递数据

    一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...

  6. 31深入理解C指针之---指针和字符串

    一.字符串与指针 1.定义:使用字符指针表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符指针 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用类似于数组的 ...

  7. 《深入理解C指针》

    <深入理解C指针> 基本信息 原书名:Understanding and using C pointers 作者: (美)Richard Reese 译者: 陈晓亮 丛书名: 图灵程序设计 ...

  8. 理解Java中的字符串类型

    1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...

  9. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

随机推荐

  1. UITableView上添加按钮,按钮点击效果延迟的解决办法

    在自定义的TableView的初始化方法做如下操作 - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame: ...

  2. PHP 存储密码

    最佳实践是 $hashedPassword = password_hash('my super cool password', PASSWORD_DEFAULT); $res = password_v ...

  3. Codevs1080 线段树练习

    题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或 ...

  4. 【费用流】loj#545. 「LibreOJ β Round #7」小埋与游乐场

    好像现在看来这个缩点的思路挺清晰啊 题目描述 有两个非负整数组成的可重集合 $A$ 和 $B$. 现在你可以对 $A$ 中至多 $k$ 个元素进行操作.操作方法为:设你准备操作且未被操作过的 $A$ ...

  5. IntelliJ IDEA 配置 Tomcat 运行web项目

    运行前提: 配置好 Java 的运行环境 配置好 Tomcat 安装 IntelliJ IDEA 开始 1.创建项目并配置 关于配置SDK,等建完项目再说 没有配置SDK的话 会出现下面的弹框,点击 ...

  6. (67)windows安装zabbix监控

    在windows下安装zabbix agent,方法非常简单.首先到zabbix官方下载windows版本agent,地址:http://www.zabbix.com/download.php,找到“ ...

  7. 【mysql】【转发】[Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,I

    [Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for o ...

  8. Python开发环境与开发软件的安装

    Python开发的必要因素: 开发软件:PyCharm 社区版 PyCharm安装过程: 首先去官网下载:(链接为:  https://www.jetbrains.com/pycharm/downlo ...

  9. 剑指Offer(书):顺时针打印数组

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 ...

  10. exp分析

    1 from pwn import* 2 3 local =1 4 debug = 1 5 6 if local: 7 p = process('./pwn1') 8 else: 9 p = remo ...