C-字符数组的存储, 字符指针,  fputs, fgets

上课笔记:

字符串在C语言中的存储(数组和指针)

1. 使用字符数组来存储

1 char name[5] = {‘j’,’a’,’c’,’k’};
2 char name[] = {‘j’,’a’,’c’,’k’};
3 char name[] = {“jack”}; //只有直接给字符数组初始化1个串的时候, 才会自动加 ‘\0’
4 char name[] = “jack”;

2. 使用字符指针来存储字符串数组

char *name = “jack”;

char name[] = “jack”; 的区别

当二者都是局部变量的时候

数组连同数组元素都是申请在栈区

指针变量 申请在栈区,  但是内容是存在于常量区的一个数组,  指针变量再指向的常量区的字符串的地址

当二者都是全局变量的时候

数组也是存在常量区(全局变量), 数组内容也是在常量区

指针在常量区, 字符串按数组形式也是存在于常量区, 指针指向的时候字符串所对应的地址

以字符数组存储字符串数据,  不管是全局的还是局部的, 都可以通过下标 去修改字符数组中的每一个元素

以字符指针的形式存储字符串数据, 这个时候字符指针指向的字符串数据是无法修改的, 不管是全局的指针变量还是局部的指针变量, 都是无法通过指针去修改字符串数据的

字符串的恒定性

前提: 是以字符指针形式存储的字符串

1. 字符指针存储字符串数据的时候, 不管是全局和局部,  字符串数据都是在常量区的; 并且一旦存储到了常量区, 字符串数据就无法再发生更改

2. 当我们以字符指针的形式将字符串数据存储到常量区的时候, 并不是直接将字符串存储到常量区, 而是先检查常量区中是否有相同内容的字符串

如果有, 直接将这个字符串的地址拿过来

如果没有, 那就将这个字符串数据存储在常量区

3. 当我们重新为字符指针初始化1个字符串的时候

并不是修改原来的字符串, 而是重新创建了一个字符串, 再把这个新的字符串的地址赋值给它

4.

1 char *name = “jack”;
2 name = “rose”; 

这样是可以, 但是不是把”jack”改成”rose”

而是重新创建1个”rose”

再把”rose”地址赋值给name

1 char name[] = “jack”;
2 name = “rose”;

不行, name 是数组名, 代表的也是数组的地址, 不能直接为数组名赋值

但是可以 name[0] = ‘r’;

面试题

求一个字符串里面某个字符出现的次数

思路:

1. 先用一个指针变量指向这个字符串

2. 遍历

将字符串存储到文件中

1. 先声明1个文件指针, 指向磁盘上的文件

FILe *pfile = fopen(“文件路径”,  “对文件进行的操作”)

2.  使用fputs函数将指定的内容写入到文件当中

fputs(变量, pfile);

3. 写完之后用 fclose()函数将创建的文件关闭

fclose(pfile);

4. 注意: 当操作模式为”w” 的时候, 如果指定文件不存在, 那就创建文件吗, 如果文件存在, 直接覆盖文件原来内容

5. 只有当操作模式为 “a” 的时候, 如果文件存在, 就会把新的内容追加进去, 如果不存在, 那么就创建文件

时间: 2024-10-09 20:02:01

C-字符数组的存储, 字符指针,  fputs, fgets的相关文章

常量字符 数组 与常量字符 串

常量字符数组与常量字符串: const char str1[] = "abc"; const char str2[] = "abc"; const char *p1 = "abc"; const char *p2 = "abc"; printf("%d %d %d %d\n",str1, str2,p1,p2); 结果是什么? 前两个是字符数组,定义在栈上,明显地址不同 字符串常量定义在静态区,仅有一份拷贝

倒置字符数组中的字符

问题:如何把字符串 "We are the world" 转成 "world the are we" ?如果最多只能用两个额外的变量又该如何实现这样的转换? 分析:1.把字符串转成字符数组,然后对字符数组进行操作. 2.选择倒置字符数组的方法:用一个临时变量temp来交换两个字符,然后依次移动数组中的其他元素:利用 A=A+B, B=A-B, A=A-B 方式来交换两个字符. 3.根据数组中首尾字符的位置来倒置它们之间的字符. 4.优化方法:减少循环的次数,减少变量

从字符数组中删除字符

/*实现程序的功能:从字符数组s中删除存放在c中的字符.*/ #include <stdio.h> int main(int argc, const char *argv[]) { char s[80],c; printf("请输入一个字符串\n"); gets(s); printf("请输入一个字符\n"); scanf("%c",&c); //遍历字符串 for (int i = 0; s[i] != '\0'; i++)

一道经典面试题,字符数组排序问题(字符包含a-z、A-Z、0-9.)

一个字符数组,里面的字符可能是a-z.A-Z.0-9.现在要求对数组进行排序,要求所有小写字符放在最前面, 所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序. 解析:可以将整个字符数组进行排序,然后将整个数组逆序,然后a-z.A-Z.0-9在分别逆序就可以了 //一个字符数组,里面的字符可能是a-z.A-Z.0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间, //所有数字放在最后,而且各部分内部分别有序. #include <iostream> #

内存的堆分配和栈分配 &amp; 字符数组,字符指针,Sizeof总结

堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻

转:字符数组与字符指针

转自:http://blog.csdn.net/qiumm/article/details/5657120 1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a st

字符数组与字符指针的区别与联系

1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a string."; 此时,string是字符数组,它存放了一个字符串. 字符指针str与字符数组str

关于C中字符数组,字符指针以及C++中string类型的两两转换及排序

// practise.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string.h> #include <string> #include <algorithm> #include <iostream> using namespace std; int main() { /* 字符串转字符数组,使用strncpy_s(),比strncpy()安全*/ string str

C语言——字符数组

在C语言编程中,我们一般用一个字符数组来存放一个字符串.例如,我们想存储这个字符串“http://i.cnblogs.com”,这个字符串一共有20个字符,要存放下这个字符串,我们需要一个长度为21的字符数组.为什么是21个而不是20个呢?在C语言中,字符串数组默认以'\0'结尾,所以我们一共需要一个长度为21的字符数组来存储这个变量. unsigned char text[21] = “http://i.cnblogs.com”; 既然我们已经知道了如何存放一个字符串,那下面我们来讨论另外几个