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

篇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<
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
通过以上,我们就方向 在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
*/
文档为doc格式