-
2021-05-19 08:35:29
字符串是程序设计中一个重要的数据结构(在经典的数据结构教材中,字符串是作为一章来独立讲解的,从这里也能看出字符串是程序设计中的一个重要的数据结构),然而C语言中竟然没有专门的字符串变量。C中如何来处理这种重要的数据结构呢?
在C程序中,可以用两种方法实现一个字符串的存储和运算:字符数组和字符指针。1.符串的表现形式
在C程序中,可以用两种方法实现一个字符串。
1.用字符数组实现。
void
main(void)
{
static char string
[ ] = "I Love China!";
printf("%s\n",string);
}
运行时输出:I Love
China!
和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址,(见图1)。string[4]代表数组中序号为4的元素(v),实际上string[4]就是*(string+4),string+4是指向字符“v”指针。
图1
2.用字符指针实现。
可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。
void
main(void)
{
char *string = "I
Love China!";
printf("%s\n",string);
}
在这里没有定义字符数组,但C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串数组。在程序中定义了一个字符指针变量string。并把字符串首地址(即存放字符串的字符数组的首地址)赋给它(见图2)。
图2
有人认为string是一个字符串变量,以为定义时把"I Love
China!"赋给该字符串变量,这是不确切的。定义string的部分:
char *string =
"I Love China!";
等价于下面两行:
char
*string;
string = "I
Love China!";
可以看到:string被定义为一个指针变量,它指向字符型数据,请注意只能指向一个字符变量或其它字符类型数据,不能同时指向多个字符数据,更不是把"I Love
China!"这些字符存放到string中。只是把"I Love
China!"的首地址赋给指针变量string(不是把字符串赋给*string)。因此不要认为上述定义行等价于:
char
*string;
*string = "I Love
China!";
在输出时,用
printf("%s\n",string);
%s表示输出一个字符串,给出字符指针变量名string,则系统先输出它所指向的一个字符数据,然后自动使string加1,使之指向下一个字符,然后再输出一个字符,……,如此直到遇到字符串结束标志‘\0’为止(‘\0’的ASCII码为0,ASCII码为0的字符是“空操作字符”,即它不引起任何控制操作,也不是一个可显示的字符)。注意,在内存中,字符串的最后被自动加了一个‘\0’(如图8.18所示),因此在输出时能确定字符串的终止位置。
通过字符数组名或字符指针变量可以输出一个字符串。而对一个数值型数组,是不能企图用数组名输出它的全部元素的。如:
int
i[10];
printf("%d\n",i);
是不行的,只能逐个元素输出。显然,可以把字符串看作为一个整体来处理,可以对一个字符串进行整体的输入输出。
2.字符串指针作函数参数
将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,即用字符数组名作参数或用指向字符串的指针作参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了的字符串。
3.字符指针变量与字符数组
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点:
(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。
(2)赋初值的方式。对数组赋初值要用static存储类别,如
static str[ ]={
"I love China! ");
而对字符指针变量不必加static存储类型,如
char *a = "I
love China! ";
这是因为并没有对数组初始化,只是对指针变量初始化。
(3)赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
char
str[14];
str = "I love
China! ";//错误
而对字符指针变量,可以采用下面方法赋值:
char
*a;
a = "I love
China! ";
但注意赋给a的不是字符,而是字符串的首地址。
更多相关内容 -
C语言指针算术运算
2021-05-19 08:58:19在C语言指针中保存一个值的地址,所以可以对指针变量进行算术运算。 C语言中的指针可以进行以下算术运算:递增递减加法减法比较1.递增指针在数组中使用递增指针是因为它是连续的内存位置。此外,经过计算我们可以...在C语言指针中保存一个值的地址,所以可以对指针变量进行算术运算。 C语言中的指针可以进行以下算术运算:
递增
递减
加法
减法
比较
1.递增指针
在数组中使用递增指针是因为它是连续的内存位置。此外,经过计算我们可以知道下一个位置的值。
递增操作取决于指针变量的数据类型。递增指针的公式如下:
new_address= current_address + i * size_of(data type)
32位
对于32位int变量,它将增加到2个字节。
64位
对于64位int变量,它将增加到4个字节。
下面来看看看在64位操作系统上增加指针变量的例子。创建一个源文件:increment-pointer.c,其代码如下 -
#include
void main() {
int number = 50;
int *p;//pointer to int
p = &number;//stores the address of number variable
printf("Address of p variable is %u \n", p);
p = p + 1;
printf("After increment: Address of p variable is %u \n", p);
}
执行上面示例代码,得到以下结果 -
Address of p variable is 17824724
After increment: Address of p variable is 17824728
2.指针递减
与指针递增一样,我们可以递减一个指针变量。递减指针的公式如下:
32位
对于32位int变量,它将递减2个字节。
64位
对于64位int变量,它将递减4个字节。
我们来看看在64位操作系统上递减指针变量的例子。创建一个源文件:decrement-pointer.c,其代码如下 -
#include
void main() {
int number = 50;
int *p;//pointer to int
p = &number;//stores the address of number variable
printf("Address of p variable is %u \n", p);
p = p - 1;
printf("After decrement: Address of p variable is %u \n", p);
}
执行上面示例代码,得到以下结果 -
Address of p variable is 18218432
After decrement: Address of p variable is 18218428
3.指针相加
我们可以在指针变量上相加一个值。指针相加值的公式如下:
new_address= current_address + (number * size_of(data type))
32位
对于32位int变量,它将相加上2 * number的值。
64位
对于64位int变量,它将增加4 * number的值。
下面来看看看在64位操作系统上相加一个值到指针变量的例子。创建一个源文件:addition-pointer.c,其代码如下 -
#include
void main() {
int number = 50;
int *p;//pointer to int
p = &number;//stores the address of number variable
printf("Address of p variable is %u \n", p);
p = p + 3; //adding 3 to pointer variable
printf("After adding 3: Address of p variable is %u \n", p);
}
执行上面示例代码,得到以下结果 -
Address of p variable is 11926728
After adding 3: Address of p variable is 11926740
正如你所看到的,p的地址是11926728,但是在添加了3与p变量之后,它是11926740,即4 * 3 = 12增量。由于我们使用64位操作系统,所以它会相加12,但是如果使用32位操作系统,它会相加6,即2 * 3 = 6。这是由于整数值占用32位操作系统中的2字节内存。
4.指针减法
类似于指针加法,我们可以从指针变量中减去一个值。下面给出了从指针变量中减去指定值的公式:
new_address= current_address - (number * size_of(data type))
32位
对于32位int变量,它将减去2 * number的值。
64位
对于 64位int变量,它将减去4 * number的值。
我们来看一下64位操作系统从指针变量减去指定值的例子。
创建一个源文件:subtraction-pointer.c,其代码如下 -
#include
void main() {
int number = 50;
int *p;//pointer to int
p = &number;//stores the address of number variable
printf("Address of p variable is %u \n", p);
p = p - 3; //subtracting 3 from pointer variable
printf("After subtracting 3: Address of p variable is %u \n", p);
}
执行上面示例代码,得到以下结果 -
Address of p variable is 17825120
After subtracting 3: Address of p variable is 17825108
从指针变量中减去3后,可以看到比前一个地址值小12,即:(4 * 3)。
¥ 我要打赏
纠错/补充
收藏
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。
-
C语言 指针操作练习
2021-05-21 09:05:09/**题目:* 将一字符串用数组输出:* 要求如下:* 1、字符串str=“ls -wl -jsj lst dwoc sllj –woih “;字符串中的空格是无规律的,有可能一个空格,也有可能两三个空格。** 2、将字符串输出到数组arr[0]----arr[9].../*
* 题目:
* 将一字符串用数组输出:
* 要求如下:
* 1、字符串str=“ls -wl -jsj lst dwoc sllj –woih “;字符串中的空格是无规律的,有可能一个空格,也有可能两三个空格。
*
* 2、将字符串输出到数组arr[0]----arr[9]中,要求从ls后面开始输出,arr[0]=-wl,
* arr[1]=-jsj;
* arr[2]=lst;一直输到arr[9],字符串不够的话,用NULL
*
* 运行环境: turboc 2.0
* 日期: 2008 - 5 - 24
* coder: sparkvivid
*/
#include "stdio.h"
main()
{
int i,j=0,k;
char str[]="ls -wl -jsj lst dwoc sllj -woih ";
char * arr[10];/*定义字符指针数组,用来保存字符串地址*/
char * p;
/*初始化字符指针数组为全空*/
for( i=0 ; i<10 ; i++)
{
arr[i] = NULL ;
}
/*
将"-wl"的地址用arr[0]保存,
将"-jsj"的地址用arr[1]保存,
将"lst"的地址用arr[2]保存,
将"dwoc"的地址用arr[3]保存,
将"sllj"的地址用arr[4]保存,
将"-woih"的地址用arr[5]保存,
*/
for( i=2 ; str[i]!='/0' ; i++)
{
if(str[i] != ' ')
{
arr[j] = &str[i] ;
j++ ;
for(k=i ;str[k] != ' ' ;k++)
{
}
i = k;
}
}
/*如果arr[i]不为空,则输出arr[i]中保存的字符串*/
for(i=0; i<10; i++)
{
if( arr[i] != NULL )
{
p = arr[i] ; /*当前字符传地址赋给p*/
/*如果当前指针p不指向空格,则输出当前p指向的字符,如果p指向空格,则跳出while循环*/
while(*p != ' ')
{
printf("%c",*p);
p++ ; /*指针p往后移动一个字符*/
}
printf("/n");
}
}
}
运行结果 :
-
Leetcode415. 字符串相加(C语言)
2020-03-03 12:34:48字符串相加(C语言) 算法-数学(字符串加减):算法与数据结构参考 题目: 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。其中: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num...Leetcode415. 字符串相加(C语言)
算法-数学(字符串加减):算法与数据结构参考
题目:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。其中:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
输入:“120” “203”
输出:“323”思路:
双指针遍历,i、j分别指向两个数组尾部。
注意两字符串长度,进位,char与int间转换以及输出时顺序代码:
char add(char ch1,char ch2,int *carry){ int sum = (ch1-'0') + (ch2-'0') + *carry; //char-'0'转换成int char ret=sum%10+'0'; *carry=sum/10; return ret; } char * addStrings(char * num1, char * num2){ int lena=strlen(num1),lenb=strlen(num2); int len=(lena>lenb?lena:lenb)+1; //+1防进位 int carry=0,i,j,k; char* ret=(char*)calloc(len+1,sizeof(char)); //malloc报错 for(i=lena-1,j=lenb-1,k=0;i>=0&&j>=0;i--,j--) //由于先从高位遍历,故从最后一个加 ret[k++]=add(num1[i],num2[j],&carry); while(i>=0){ //长度不等时的处理 ret[k++]=add(num1[i],'0',&carry); i--; } while(j>=0){ ret[k++]=add('0',num2[j],&carry); j--; } if(carry) ret[k++]=carry+'0'; //有进位 for(i=0,j=k-1;i<j;i++,j--){ //倒序 char tmp=ret[i]; ret[i]=ret[j]; ret[j]=tmp; } return ret; }
-
C语言—字符串、指针
2021-05-20 19:08:51---字符串1.字符串"jack" == 'j' + 'a' + 'c' + 'k' + '\0' 用数组保存字符串char name[10] = "jack";printf(name);2.字符串的一些定义都是字符串(\0的ASCII码值是0)char name[8] = "it";char name2[8] = {'i','t','... -
C语言字符串笔试题含答案
2021-10-15 14:46:45面试题1:使用库函数将数字转换为字符串 出现频率:*** 面试题2:不使用库函数将整数转换成字符串 出现频率:***** 面试题3:使用库函数将字符串转换为数字 出现频率:**** 面试题4:不使用库函数将字符串转换为... -
大数相加c语言实现
2021-05-19 08:06:56c语言中int类型是有一定的范围的,例如在32位的情况下可以表示的最大整数是2^31 – 1 =2147483647 。如果想要进行更多位数的整数加法,可以用数组,分别对每个位进行计算。合法数字检查输入的时候应检查输入的是否是... -
※【C】设计指针函数完成字符串的相加
2021-10-21 20:27:25设计一个函数指针,完成字符串的相加并返回相加后字符串的地址 方式一(不推荐,总是会忘记free掉内存): #include<stdio.h> #include<stdlib.h> #include<string.h> char * catstr(char * s1,... -
C语言 复制字符串 malloc
2021-05-21 03:07:13今天在看前辈的代码,对其中字符串复制有时候直接把指针赋给另一个指针,有的malloc一个内存,然后把整个字符串的值拷贝过来,有点费解,就研究了一下,会了之后发现也没什么奥秘,其实很简单,不过还是记录一下比较... -
LeetCode 2. 两数相加(C语言)
2021-05-19 09:38:57如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 ->... -
字符串数组相加操作(转)
2018-08-14 14:59:37strcat 将两个char类型连接。 char d[20]=”GoldenGlobal”; char *s=”View”; strcat(d,s); ...d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。 返回指向d的指针。... -
C语言 指针运算_malloc_字符串
2021-07-27 21:24:54指针运算 给一个指针加1表示要让指针指向下一个变量 int a[10]; int *p = a; *(p+1) ——> a[1] *(p+n) <==> a[n] //等价 如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义 *p++ ... -
C语言字符串函数的一些使用心得
2021-05-24 10:43:13对于C语言,爱站技术小编对C语言字符串函数的一些使用心得在此分享給各位,也请C语言编程高手多指教啦~那接下来就跟爱站技术频道的小编一起来了解下其中的详情吧。就字符串的拼接函数为例strcat.原型:extern char ... -
C语言打印字符串的一部分的方法
2021-05-19 08:37:27C语言打印字符串的一部分的方法6.6 中讨论了怎样拷贝字符串的一部分,为了打印字符串的一部分,你可以利用6.6的例子中的部分技巧,不过你现在要使用的是printf()函数,而不是sprintf()函数。请看下例:# include #... -
整理C语言中各种类型指针的特性与用法
2021-05-19 11:22:31指针为什么要区分类型:在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境 下,任何一个指针变量都只占用8个字节,并不会随所指向变量的类型而改变。虽然所有的指针都只占8个字节,但... -
字符串相加
2021-09-04 10:01:19字符串相加(点击链接进入题目) 给定两个字符串形式的非负... 我们先假设给定的不是字符串形式的数字,而是正常的非负整数,则两数相加遵循正常的加法运算,个位数与个位数相加,十位数与十位数相加,如果该位计 -
基于C语言字符串函数的一些使用心得
2021-05-19 08:16:55就字符串的拼接函数为例strcat.原型:extern char *strcat(char *dest,char *src);用法:#include 功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。说明:src和dest所指内存区域不可以重叠... -
C语言-字符串的定义及使用
2021-09-01 15:17:10字符串的存储方式有字符数组和字符指针。 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别对这些字符进行存储,即通过字符数组存储。字符数组是一个数组,且是存储... -
C语言 指针与整数相加/减,指针递增/递减示例
2017-09-03 16:11:41C语言指针变量包含指针自己的地址、存储单元储存的内容(指向的地址)、指向的地址上储存的值。 指针自己的地址:&指针名 存储单元储存的内容(指向的地址):指针名 指向的地址上储存的值:*指针名 ... -
C语言中压缩字符串的简单算法
2021-05-19 06:29:30C语言中压缩字符串的简单算法在C应用中,经常需要将字符串压缩成一个整数,即字符串散列。本文是百分网小编搜索整理的关于C语言中压缩字符串的简单算法,供参考学习,希望对大家有所帮助!想了解更多相关信息请持续... -
c语言实现字符串以指定字符进行分割
2021-11-08 15:53:57出现x次,那就从堆上分配 x + 1个字符串指针大小的二重指针 //2.对s进行第二次遍历,给二重指针指向的地址初始化 //3.对s进行第三次遍历,给二重指针指向的指针指向的值赋值 #include #include char** split(char* s, ... -
将字符串转成整形数据并相加 C语言
2021-08-28 20:34:02题目:将a和b所指的两个字符串转换成面值相同的整数,并进行相加,将结果作为函数值返回,规定字符串中只含9个的以下数字字符。 例如,主函数中输入字符串:32486和12345,在主函数中输出的函数值为:44831。 #... -
c 两个字符串数字相加
2021-03-07 23:34:27kk是字符串指针,hh ll 为整数 我多次实验下来是删除操作 我想知道这个操作的原理是什么? 我认为会影响到a 的数据,但实际输出后并没有影响a这个二维字符串的数据 <p>//char a[N][80] 已经... -
C语言基础--字符串
2022-03-31 17:49:49C语言中,有整型、浮点型、指针类型和字符型,但没有字符串型,在有些语言中是存在字符型类型的。 -
C语言 计算字符串长度的几种方法
2020-09-23 21:09:30C语言 计算字符串长度的几种方法 C语言计算字符串长度,可以手动计算也可以使用库函数或者sizeof()操作符。 自定义函数求长度 使用strlen()函数 使用sizeof()操作符 自定义函数 int cont_str(char *s) { int i = 0;... -
C语言指针定义及在函数,数组,字符串中的使用
2021-08-24 09:03:55指针是C语言的精华所在,有了指针,C语言可以实现许多灵活的操作,如动态数据结构操作等等。事实上,指针之所以有如此广泛的运用,主要有两方面:一是指针往往是某个计算的唯一表达途径,这是它的一些性质所定;另一... -
C语言 字符串和数字转换函数
2019-01-08 06:03:52atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include <stdlib.h> 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数... -
日常记录(c语言)--字符串实现大整数加法
2021-05-18 09:09:09运行环境:CentOs 64位--vim最近在看《剑指...下面是我看了之后对之前做过的大整数加法做了一些完善,之前的只能实现对纯数字字符进行求和,甚至连对空指针的处理都没有,好惭愧。我会用注释来记录自己对此算法的理... -
c语言字符串 数字转换函数大全
2016-02-25 20:39:36atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数) strtod(将字符串转换成浮点数) strtol(将字符串转换成长整型数) strtoul(将字符串转换成无符号长整型数) toascii(将... -
C语言和C++中的字符串(string)
2021-05-19 08:10:02知识内容:1.C\C++字符串简述2.C字符串相关操作3.C++ string类相关操作一、C\C++字符串简述1.C语言字符串C语言字符串是字符的数组。单字节字符串顺序存放各个字符串,并用'\0'来表示字符串结束。在C语言库函数中,有...