通过数组保存字符串和通过指针保存字符串的区别:
1.通过数组来保存的字符串,那么字符串是一个变量 str 可以修改
2.如果通过指针来保存字符串,那么字符串是一个常量 str2 不能修改
3.数组保存的字符串存储在内存的栈中,而通过指针保存的字符串存储在常量区
4.存储在栈中的变量有一个特点,当作用域结束系统会自动释放该变量
5.存储在常量区中的值不会被释放,而且多个相同的值对应的地址相同
char str3[] = "ykd";
printf("str=%p,str3=%p\n",str,str3); //str=0x7fff5fbff7ac,str3=0x7fff5fbff79c (内存地址不同)
char *str4 = "ykd";
printf("st2=%p,str4=%p\n",str2,str4); //st2=0x100000f78,str4=0x100000f78 (内存地址相同)
return 0;
//// main.c// C语言学习#include int main(int argc, const char * argv[]) { //保存字符串 //通过数组 char str[] = "ykd"; str[0] = 'm'; printf("str = %s\n",str); //str = mkd
字符串
是用双引号括起来的字符序列。比如,"China”。
字符串
常量会在字符序列末尾添加’\0’作为结尾标记。
字符串
在内存中按照串中字符的排列顺序存放,并在末尾会添加’\0’作为结尾标记。
对于ASCII码来说每个字符占一个字节,而对Unicode码来说每个字符占两个字节。本教程只讲ASCII编码的字符和
字符串
。
C++和C一样,基本数据类型的变量中没有
字符串
变量,那怎样处理
字符串
的存储和操作呢?
C语言中用字符
数组
存放
字符串
,操作同一般
数组
类似。C++语言继承了这种方式。除此之外,标准C++库中还定
一、用一维字符
数组
存放
字符串
1、C语言对
字符串
的约定
字符串
是借助于字符型一维
数组
来存放的,并规定以字符‘\0’作为
字符串
的结束标志,’\0’作为标志占用存储空间,但不计入串的实际常量
2、C语言中表示
字符串
常量的约定
虽然c语言中没有
字符串
数据类型,但却允许有‘字符窜常量,
字符串
常量是由双引号括起来的,在表示
字符串
常量时不需要人为在其末尾加‘\0’.
3、C语言
字符串
常量给出的是地址值
每个字...
我们可以用
字符串
常量对字符
指针
进行初始化。例如,有说明语句:
char *str = "This is a string.";
是对字符
指针
进行初始化。此时,字符
指针
指向的是一个
字符串
常量的首地址,即指向
字符串
的首地址。
这里要注意字符
指针
与字符
数组
之间的
区别
。例如,有说明语句:
char string[ ]="This is a string.";
此时,string...
使用char类型的
数组
保存
字符串
。每个
字符串
都需要以’\0’结尾,所以
字符串
数组
的长度最小等于字符个数+1
三种等价的初始化方式:
char str[12]={'H','e','l','l','o',',','W','o','r','l','d','\0'}; // 初始化列表
char str1[12]="Hello,World"; // 指定字符
数组
长度,
字符串
末尾隐含设为'\0'
char str2[]="Hello,World"; // 未指定字符
数组
长度,
字符串
末尾隐含设为'\0'
1.双括号括起来的是
字符串
字面量,也叫
字符串
常量,如果
字符串
字面量之间没有间隔或用空白字符分隔会被视为串联在一起的
字符串
常量。双引号括起来的内容被视为指向该
字符串
存储位置的
指针
。
2.
字符串
常量属于静态存储类别。
3.
字符串
初始化需要足够的空间,还需要一个元素容纳空字符。无下标时编译器自动分配空间,但仅能在初始化时使用,若之后想扩充,则必须初始化时自己声明。
4.用
数组
(ar[])表示
字符串
时会把静态存储区中的
字符串
拷贝一个副本存储于
数组
中,此时ar被视为该
数组
首元素的地址。
注意:ar是地址常量不能更改。
典型问题2:
用什么来暂存并输出结果?还是只是记录下来相关位置——这是我底下未完成版本1想到的思路——用一个count[sizeof(A)]
数组
记录下A每个位置作为起点所能和B达到的最大重合,最后判断查找
数组
中最大值,此时目标子
字符串
的起点下标(i)和 i 对应的长度(counter[i])都有了。
这是针对不知道
字符串
大小并且不占用额外空间的做法,需要非常繁琐的操作,要加很多标记,越界判断也会有些麻烦(结合优势么,用
字符串
常量而不是栈空间中的字符
数组
,有'\0'——就好判断了!)
(关于空间的占用,如果要用一个和
字符串
a一样长的
数组
counter来计录a中各起点对应与b最大重合子
字符串
,这个
数组
也要和a一样长,空间上也不合适,除非情形很特殊,a短b长,不然不如直接malloc()一个堆空间来储存当前最长“子
字符串
”,并实时更新)
先放一个改完编译测试成功的。
release1
//题目:要求比较A
字符串
(例如“abcdef"),B
字符串
(例如(bdcda)。找出重合度最大的子
字符串
,输出(根据OJ经验,输>出结果对即可)
#include
#include
#include
main(){
char *A = "abcderfghi";
char *B = "aderkkkkkabcd";
int i,j,c = 0,count = 0;
unsigned int maxSeg = 0;
int max = strlen(A) > strlen(B) ? strlen(A) : strlen(B);
char* final = (char*)malloc(sizeof(char) * (max + 1));
final[max] = '\0';
for(i = 0;A[i] != '\0';i++){
for(j = 0;B[j] != '\0';j++){
while(A[i + c] == B[j] && A[i+c] != '\0' && B[j] != '\0'){
count++;
if(count > maxSeg){
strncpy(final,(A + i),count);
maxSeg = count;
count = 0;
c = 0;
printf("%s\n",final);
free(final);
这是能将就用的第一个版本~!关于结束符'\0'能否影响free()的使用,觉得是完全不用操心的,因为malloc的大小是系统来
保存
的,删除时候系统来接手就完了,而'\0'结束符只是针对一些常规
字符串
操作,比如printf()用%s控制输出时~!
新难点:找到的子
字符串
同时一样长怎么办?那我这只能叫做”第一个最长的重合
字符串
“用两块空间来存储?三
在所给的10个单词中找出不包含元音字母(a,e,i,o,u)的单词,将符合条件的单词的个数以及这些单词按照字典顺序输出。
⑴ 编写函数int FindNoVowel(char *str[],int num,char res[][20]),str指向的
指针
数组
中
保存
若干单词
字符串
的首地址,num
保存
单词的个数,res指向的
数组
保存
找到的符合条件的单词
字符串
,每行存放一个单词,要求将符合条件的单词按字典顺序存储,函数返回符合条件的单词个数。
⑵ 编写main()函数,声明
数组
并用测试数据初始化
数组
,调用函数FindNoVowel,将符合条件的所有单词按字典顺序输出,单词之间用1个空格隔开。
指针
与
字符串
一、
字符串
基础1、
字符串
声明2、
字符串
字面量池3、
字符串
初始化1、初始化字符
数组
2、初始化字符
指针
3、从其他输入初始化
字符串
4、
字符串
位置小结二、标准
字符串
操作1、比较
字符串
2、复制
字符串
3、拼接
字符串
三、传递
字符串
1、传递简单
字符串
2、传递字符常量的
指针
3、传递需要初始化的
字符串
4、给应用程序传递参数四、返回
字符串
1、返回字面量的地址2、返回动态分配内存的地址
导读:
字符串
可以分配在内存的不同区域,通常使用
指针
来支持
字符串
操作。
指针
支持动态分配
字符串
和将
字符串
作为参数传递给函数。
了解声明和
3、cout对象认为char的地址是
字符串
的地址,如果给cout提供一个字符的地址,则它将从该字符开始打印,直至遇到空字符为止;
4、用引号括起来的
字符串
像
数组
名一样,也是第一个元素的地址;
记住:在cout和多数C++表达式中,char
数组
名、指向char的
指针
以及用引号括起来的
字符串
常量都被解释为
字符串
第一个字符的地址.
5、无法使用string对象初始化char
指针
,但是string类提供了一个名为c_str的成员函数,以实现此要求;
6、可以使用指向char
数组
的
指针
,构