一、字符串:是以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. iOS中的数据存储方式_SQLite3

    优点: 1) SQLite是一款轻型的嵌入式数据库; 2) 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 3) 它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还 ...

  2. 简单的Datable转List方法

    public static class DataTableUtils<T> where T : new() { public static List<T> ConvertToM ...

  3. html5新结构标签

    html5新结构标签 <header>  定义 section 或 page 的页眉,也就是定义头部的标签. <footer> 定义 section 或 page 的页脚. & ...

  4. 【Git版本控制】Git的merge合并分支命令

    1.实例 git checkout master git merge dev merge合并分支只对当前分支master产生影响,被合并的分支dev不受影响. 假设你有两个分支,“stable” 和 ...

  5. day2-python 登录

    # username = 'niuhanyang' # 写一个判断登录的程序: # 输入: username # password # 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 ...

  6. 15.Yii2.0框架where单表查询

    目录 新建控制器 HomeController.php 新建model article.php 新建控制器 HomeController.php D:\xampp\htdocs\yii\control ...

  7. 《linux设备驱动开发详解》笔记——12linux设备驱动的软件架构思想

    本章重点讲解思想.思想.思想. 12.1 linux驱动的软件架构 下述三种思想,在linux的spi.iic.usb等复杂驱动里广泛使用.后面几节分别对这些思想进行详细说明. 思想1:驱动与设备分离 ...

  8. HDU - 6199 gems gems gems (DP)

    有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...

  9. /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! 翻译:系统显然在使用,不会在这里做文件系统 ...

  10. JAVA-基础(四) Aarryas 数组

    1. asList( )方法 返回一个被指定数组支持的List.换句话说,列表和数组访问的是同一个 单元.它具有如下的形式: static List asList(Object[ ] array) 2 ...