欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

c语言中字符串操作的工具类

时间:2023-02-01 07:47:03 其他范文 收藏本文 下载本文

下面小编为大家带来c语言中字符串操作的工具类,本文共8篇,希望大家能够受用!

c语言中字符串操作的工具类

篇1:c语言中字符串操作的工具类

1.编写头文件

#define _CRT_SECURE_NO_WARNINGS

//#pragmawarning(disable:4996)

#include

#include

#include

struct CString

{

char *p; //保存字符串首地址

int reallength; //实际长度

};

typedef struct CString mystring;//简写

//原封不动初始化

void init(mystring *string);

//开辟长度,内存清零

void initwithlength(mystring *string, int length);

//初始化并拷贝字符串

void initwithstring(mystring *string, char *copystring);

//打印

void printfstring(mystring *string);

//增加字符

void backaddchar(mystring *string, char ch);

//增加字符串

void backaddstring(mystring *string, char*str);

//执行指令

void run(mystring *string);

//返回第一个找到的字符的地址

char * findfirstchar(mystring *string, char ch);

//返回第一个找到的字符串的地址

char * findfirststring(mystring *string, char *str);

//删除第一个找到的字符

int deletefirstchar(mystring *string, const char ch);

//删除第一个找到的字符串

int deletefirststring(mystring *string, char * const str);

//任意增加字符

void addchar(mystring *string, char ch, char *pos);

//任意增加字符串

void addstring(mystring *string, char*str, char *pos);

//改变字符

void changefirstchar(mystring *string, const char oldchar, const char newchar);

//改变字符串

void changefirststring(mystring *string, char * const oldstring, char *const newstring);

2.编写函数实现

#include “mystring.h”

#include “stdio.h”

#include “stdlib.h”

/* 求字符串的长度 */

int mystrlen(char *p)

{

if (p == NULL)

{

return -1;//失败,

}

int length = 0;

while (*p != '\0')//字符串终止条件

{

length++;//长度自增

p++;//指针不断向前

}

return length;

}

/*字符串拷贝 */

char *mystrcpy(char *dest, const char *source)//const限定不被意外修改

{

if (dest == NULL || source == NULL)

{

return NULL;//为空没有必要干活了

}

char * destbak = dest;

while (*source != '\0')//一直拷贝

{

*dest = *source;//赋值字符

source++;

dest++;//指针不断向前,字符挨个赋值

}

*dest = '\0';//结尾

return destbak;//返回地址

}

/*字符串拼接*/

char *mystrcat(char *dest, const char *source)

{

if (dest == NULL || source == NULL)

{

return NULL;//失败

}

else

{

char *destbak = dest;//保留地址

while (*dest != '\0')

{

dest++;//指针向前移动

}

//从尾部开始拷贝

while (*source != '\0') //循环被被拷贝的字符串

{

*dest = *source;//字符串赋值

dest++;

source++;

}

*dest = '\0';//结尾

return destbak;

}

}

char * mystrchr(const char *dest, const char ch)

{

if (dest == NULL)

{

return NULL;

}

while (*dest != '\0')

{

if (*dest == ch)

{

return dest;//找到返回地址

}

dest++;

}

return NULL;//返回

}

char *mystrstr(const char * const dest, const char * const findstr)

{

if (dest == NULL || findstr == NULL)

{

return NULL;

}

char *destbak = dest;

char *p = NULL;//保存找到的地址

while (*destbak != '\0')

{

int flag = 1;//假定是相等

char *findstrbak = findstr;

char *nowdestbak = destbak;

while (*findstrbak != '\0')

{

if (*nowdestbak != '\0')

{

if (*findstrbak != *nowdestbak)//有一个不等

{

flag = 0;//赋值为0代表不等

}

nowdestbak++;

findstrbak++;

}

else

{

flag = 0;//设置标识

break;

}

}

if (flag == 1)

{

p = destbak;//当前位置

return p;

}

destbak++;

}

return NULL;

}

void init(mystring *string)

{

string->p = NULL;

string->reallength = 0;//初始化结构体字符串

}

void initwithlength(mystring *string, int length)

{

//string->p =(char *) malloc(sizeof(char)*length);//分配内存

string->p = (char *)calloc(length, sizeof(char));//分配内存并清零

string->reallength = length;//长度

}

void initwithstring(mystring *string, char *copystring)

{

int length = strlen(copystring);//获取字符串长度

string->p = (char *)calloc(length + 1, sizeof(char));//分配内存

mystrcpy(string->p, copystring);//拷贝字符串

string->reallength = length + 1;//设置长度

}

void backaddchar(mystring *string, char ch)

{

if (mystrlen(string->p) + 1 == string->reallength)//意味着满了

{

//重新分配内存

篇2:c语言中字符串函数的使用

#include

#include

/*

char s1[]=“I am a student”;

char s2[20]=“teacher”;

char s3[]=“student”;

int result;

char s4[20],*p;

1.串的长度

int strlen(char *str):

printf(“%d\n”,strlen(s1));//长度为14

printf(“%d\n”,strlen(s2));//长度为7

2.复制

char *strcpy(char *str1,char *str2):

strcpy(s4,s2);//把s2复制给s4

printf(“%s\n”,s4);//输出teacher

3.比较

int strcmp(char *str1,char *str2):

result=strcmp(s2,s3);

printf(“%d\n”,result);//s2>s3

4.字符串定位

char *strchr(char *str,char ch);

p=strchr(s1,'s');//p指向在s1中字符's'的位置

printf(“%s\n”,p);//输出student

5.子串查找

char *strstr(char *s1,char *s2);

p=strstr(s1,s3);//p指向在s1中字符's'的位置

printf(“%s\n”,p);//输出student

6.连接

char * strcat(char *str1,char *str2):

strcat(s2,s3);

printf(“%s\n”,s2);//输出teacherstudent

*/

void ReverseName(char *name,char *newName){

char *p;

p=strchr(name,' ');//字符定位

*p='\0';

printf(“%s\n”,name);

printf(“%s\n”,p);

strcpy(newName,p+1);//复制

printf(“--%s\n”,newName);

strcat(newName,“,”);//连接

strcat(newName,name);//连接

*p=' ';

printf(“%s\n”,name);

}

int main{

char name[]=“jie wang”,newName[30];

ReverseName(name,newName);

printf(“hello world\n”);

return 0;

}

篇3:c语言中读入带空格的字符串

blog.csdn.net/pipisorry/article/details/37073023

问题:

scanf(%s, a);

运行输入hello world

回车

则输入到a的只是空格之前的部分,怎样把空格之后的部分也输出?

1. scanf( %[^ ], str );

?

1

2

3

4

5

6

7

8

9

#include

int main(){

char str[50];

scanf( %[^

], str );

printf( %s

, str );

return 0;

}

more: scanf中的正则表达式

1、定制自己的扫描集 %[abc]、%[a-z]、%[^abc]、%[^a-z],比isdigit()、isalpha()更加灵活,[]内是匹配的字符,^表示求反集。

int i;

char str[80], str2[80];

// scanf(%d%[abc]%s, &i, str, str2);

// printf(%d %s %s ,i,str,str2);

// scanf(%[a-zA-Z0-9], str);

// scanf(%[^abce], str);

scanf(%[^a-z], str);

printf(%s ,str);

2、读入一个地址并显示内存地址的内容

int main(void){

char ch='c';

printf(%p , &ch); // print the address of ch.

char *p;

cout<scanf(%p, &p); //input the address displayed above

printf(Value at location %p is %c ,p,*p);

return 0;

}

3、丢弃不想要的空白符:scanf(%c %c);

4、控制字符串中的非空白符:导致scanf()读入并丢弃输入流中的一个匹配字符,

%d,%d;

5、压缩输入:在格式码前加上*,则用户就可以告诉scanf()读这个域,但不把它赋予任何变量。

scanf(%c%*c, &ch); 使用此方法可以在字符处理时吃掉多余的回车。

2.scanf()

?

1

2

3

int t[999];

int sum=0;

while(scanf(%c,&t[sum++])!=EOF);

3.gets()gets()

?

1

2

3

4

5

6

7

8

9

10

#include

//char *fgets( char *str, int num, FILE *stream );

int main(){

char buffer[10];

//fgets(buffer,10,stdin); //带有回车符

gets(buffer);   //没有回车符

printf(%s,buffer);

return 0;

}

more: gets() 不检查字符串容量,有可能越界写数据,用户可不一定给你按套路出牌,可能输入长达300字节甚至2k字节的字符串,这样的话很危险

虽然strlen,strcyp等等这些函数因为追求高效率也不会检查指针是否为空,指针是否可写,但是这些函数是C程序员来操作的,C程序员有正确使用函数的素质。 但是gets() 是用户来输入,用户并不知道字符串上限,而且就算知道,也不一定有素质去按规定使用,要多多注意

用fgets(str,80,stdin);就不危险了,fgets比较安全

篇4:C语言中的const

C语言的中的const,代表的含义是”不可改变的变量“,或者可以成为”伪常量“

C++中 const,被称为”一个有类型描述的常量“

const int liv_num = 10; liv_num = 18; //error 因为liv_num 被const修饰不可被直接赋值

那么,我为什么说是”伪常量“?

我们知道在c中给变量赋值,有两种方式:一种就是直接赋值;一种是间接赋值,

对于第一种方式,我们已经验证是不可以的。那么,使用间接赋值是否可以实现对liv_num的值得改变呢?

注意:一定要是.c的文件,如果使用的是.cpp的话,不会出现效果,因为c++中 const,被称为”一个有类型描述的常量“

#include#includeint main{ //定义一个常量 const int liv_num = 10; //liv_num = 18; //error 因为liv_num 被const修饰不可被直接赋值 //定义一个指针指向常量 const int *pliv_num = &liv_num; //对指向常量的指针进行转换 int * pNum = (int *)pliv_num; //进行赋值 *pNum = 20; printf(liv_num = %d , liv_num);//结果为:20system(pause); return 0;}

通过以上,我们就方向 在c中 const 是 ”伪常量“, 那么也说明一个问题,const是保存在 ”栈“ 中的, 如果想验证,可以使用debug,观察内存,再此不在叙述,

篇5:c语言中的1是什么意思

编译器

GCC,GNU组织开发的开源免费的编译器

MinGW,Windows操作系统下的GCC

Clang,开源的BSD协议的基于LLVM的`编译器

Visual C++:: cl.exe,Microsoft VC++自带的编译器

集成开发环境(IDE)

CodeBlocks,开源免费的C/C++ IDE

CodeLite,开源、跨平台的C/C++集成开发环境

Orwell Dev-C++,可移植的C/C++IDE

C-Free

Light Table

Visual Stdio系列

Hello World

篇6:解析C语言中的sizeof.net

一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等,它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大

一、sizeof的概念

sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。

二、sizeof的使用方法

1、用于数据类型

sizeof使用形式:sizeof(type)

数据类型必须用括号括住。如sizeof(int)。

2、用于变量

sizeof使用形式:sizeof(var_name)或sizeof var_name

变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。

注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

如sizeof(max)若此时变量max定义为int max,sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。

三、sizeof的结果

sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

1、若操作数具有类型char、unsigned char或signed char,其结果等于1。

ANSI C正式规定字符类型为1字节。

2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10,

3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。

4、当操作数具有数组类型时,其结果是数组的总字节数。

5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。

让我们看如下结构:

struct  a;

在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。

这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。

6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

四、sizeof与其他操作符的关系

sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。

五、sizeof的主要用途

1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

void *malloc(size_t size),

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:

void * memset(void * s,int c,sizeof(s))。

六、建议

由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。

原文转自:www.ltesting.net

篇7:C语言中的复数C基础

复数:

复数比较详细的内容请参考:复数代数

C支持复数的数学计算,复数Z可以在笛卡尔坐标表示为:Z=x+y*I;其中x和y是实数,I是虚数单位,数x被称为实部,数y为虚部。在c语言中,一个复数是有浮点类型表示的实部和虚部。两部分都具有相同的类型,无论是float,double或者long double。

float _complex:实虚都为float

double _complex:实虚都为double

long double _complex:实虚都为long double

如果在c 源文件中包含了头文件 complex.h ,complex.h定义了complex 和 I宏。宏定义complex和一个关键字_complex 同义。我们可以用complex代替_complex.

下面是个简单的例子,运行在debian 7 (32bit)

代码截图:

运行结果:    详细代码:

View Code

creal(x):得到复数的实部(对于 double),如果对于float,使用crealf(x),如果对于long double ,请使用 creall(x)

cimag(x):得到复数的虚部(对于double),如果对于float,使用crealf(x),如果对于long double ,请使用 creall(x)

此外还有一点值得注意的是:

cos(), exp() 和 sqrt()同样也会有对应得复数方法,例如:ccos(),cexp(),csqrt()

本人是个初学者,如果博客中有任何错误或者有更好的技术知识,请多多指教!

篇8:C语言中函数的返回值

如果某个函数从一个地方返回时有返回值,而从另一个地方返回时没有返回值,该函数并不非法,但可能是一种出问题的征兆,”

这句话觉得有些难以理解。

于是写了段测试代码,如下:

#include

int f(int i) {

if (1)

return;

else

return 1;

}

main(void) {

int i = -10;

printf(“%d\n”, f(i));

}

/*

* 本程序用gcc编译没有问题,

* 运行结果如下:

* -10

*/

生活语言中的物理常识

《杠杆类工具的研究》的教学反思

Go语言中接口组合的实现方法

对汉英语言中不同死亡委婉语的解读

按字节截取字符串

朱子语类阅读答案

朱子语类阅读答案

包含言中的成语

操作心得体会

在C语言中什么是指针和数组等价

《c语言中字符串操作的工具类(共8篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档