字符串的输入、输出、连接、拷贝、比较

字符串就是一种更加特殊的线性结构。

它表现在:1.使用char类型的数组来存储。2.面向字符串的操作与一般的顺序表不同,比如元素的插入、删除、确定位置等,一般的顺序表定义的操作都是1次处理一个元素,而字符串的操作往往是处理若干个字符。

因为字符串操作的这些特殊性,所以C语言中专门在string.h头文件中定义了许多关于字符串的操作,其中比较重要的是:字符串输出函数
puts、字符串输入函数gets、字符串连接函数strcat、字符串拷贝函数strcpy、字符串比较函数strcmp、测字符串长度函数strlen等。

定义一个字符串,不是通过定义一个很长的数组来实现,而是通过动态分配内存的方法来实现,这样的话,需要一个变量记录动态数组的长度,有了这个长度,我们就不需要像C语言那样通过在结尾加添‘\0‘来判断字符串是否结束了。

//字符串
typedef struct String
{
	char* data;
	int size;
}String;

//分配字符串
bool assignStr(String *pT,char *chars)
{
    int i = 0;
	//求字符串的长度
    while(chars[i] != '\0')
        ++i;    

    //如果是空串
    if(0 == i)
    {
        pT->data = NULL;
        pT->size = 0;
    }
    else
    {
        pT->size = i;
        pT->data = (char*)malloc(sizeof(char) * pT->size);
        if(NULL ==pT->data )
            return false;
        else
        {
            for(int j = 0; j < i;++j)
                pT->data[j] = chars[j];  

        }
    }
    return true;
}  

//销毁字符串
void clearStr(String *pS)
{
    free(pS->data);
    pS->data = NULL;
    pS->size  = 0;
}  

//求字符串长度
int strLength(String *pS)
{
    return pS->size;
} 

//字符串拷贝;将pS拷贝到pT
bool strCpy(String *pT,String *pS)
{
	if(strLength(pT)<strLength(pS))
	{
		pT->data=(char*)realloc(pT->data,sizeof(char)*pS->size);
		pT->size=pS->size;
	}
	if(NULL==pT->data)
		return false;
	else
	{
		for(int i=0;i<strLength(pT);i++)
		{
			pT->data[i]=pS->data[i];
		}
		pT->size=pS->size;

		return true;
	}
}

//判断是否为空
bool is_empty(String *pS)
{
    if(NULL == pS->data && 0 == pS->size)
    {
        printf("empty");
        return true;
    }
    else
        return false;
} 

//字符串比较,前>后:1;前=后:0;前<后:-1
int strCmp(String *pT,String *pS)
{
	int i=strLength(pT);
	int j=strLength(pS); 	

	int k;

	i<j?k=i:k=j;  //当i=j时,k=j
	for(int n=0;n<k;n++)
	{
		if(pT->data[n]>pS->data[n])
			return 1;
		else if(pT->data[n]<pS->data[n])
		{
			return -1;
		}
	}
	 //如果程序能完整执行完for循环,说明两个字符串的前k个字符相等
    //剩下只要比较它俩谁长就可以了
	if(i<j)
	{
		return -1;
	}
	else if(i>j)
	{
		return 1;
	}
	else
		return 0;
}

//将第二个字符串连接到第一个后面
void strCat(String *pT,String *pS)
{
    int i = strLength(pT);
    int j = strLength(pS);
    pT->data = (char*)realloc(pT->data,sizeof(char) * (i+j));
    for(int m = i,n = 0 ; m < (i+j); ++m,++n)
        pT->data[m] = pS->data[n];
    pT->size = i + j;  

} 

//从指定的位置返回指定长度的子串
bool getSubString(String *pS,int pos,int len,String *pSubString)
{
    //判断输入的位置和长度是否合法
    if(pos < 0 ||  len <= 0 || len+pos > strLength(pS))
        return false;
    for(int i = pos,j = 0; i<pos+len;++i,++j)
    {
        pSubString->data[j] = pS->data[i];
    }
    pSubString->size = len;
    return true;
}  

//在指定位置后插入字符串;在pS中插入pT,插入位置为pos
bool insertStr(String *pT,String *pS,int pos)
{
    int i = strLength(pT);
    int j = strLength(pS);
    if(pos < 0 || pos > j)
        return false;
    pS->data = (char*)realloc(pS->data,sizeof(char) * (i+j));
    pS->size = i+j;
    if(NULL == pS->data)
        return false;  

	//将需要插入的字符串的长度空出来,然后将pS的每个元素依次后移
 for(int m = i+j ; m > pos; --m)
     pS->data[m] = pS->data[m-i]; 

	//将需要插入的字符串的值插入到pS中
    for(int n = pos,l = 0; n < i+pos;++n,++l)
        pS->data[n] = pT->data[l];
    return true;
}  

//删除指定位置后面的若干个字符
bool deleteStr(String *pS,int pos,int len)
{
    int j = strLength(pS);
    if(pos < 0 || pos > j || len + pos > j)
        return false;
    for(int i = pos; i < j-len;++i)
        pS->data[i] = pS->data[i+len];
    pS->size -= len;
    return false;
}  

//检索:源字符串的某个位置以后是否有目标字符串,有则返回位置,无则返回-1
//在pS中是否有pT
int index(String *pT,String *pS,int pos)
{
	int m=strlen(pS);
	int n=strlen(pT);

	//如果比较位置大于等于源字符串的长度,返回-1
	if(pos>=m)
		return -1;

	int i=pos,j=0;
	//当两个字符都没有访问到最后一个元素时,继续
	while(i+n<m&&j<n)
	{
		//如果从某一个位置起二者相等,继续比较
		if(pS->data[i]==pT->data[j])
		{
			i++;
			j++;
		}
		//否则源字符串从第一个字符匹配的下一个位置开始继续
		else
		{
			i=i-j+1;//i和j是同步增长的
			j=0;
		}
		//如果目标串已经找完,则找到
		if(j==strLength(pT))
		{
			return i-strLength(pT);
		}

	}
	//没有找到,返回-1
    return -1;  

}

//替换
void replace(String *pT,String *pS,String *pNew)
{
    //使用已经定义的操作完成:查找、删除、插入
    int m = strLength(pT);
    int n = strLength(pNew);
    int i = 0;
    do{
        i = index(pT,pS,i);
        if(i != -1)
        {
            deleteStr(pS,i,m); //删除pS中i位置之后的m个字符
            insertStr(pNew,pS,i); //在pS中插入pNew,插入位置为i
            i += n;
        }
    }
    while(i != -1);
}  

//打印字符串,调试时使用
void printStr(String *pT)
{
    printf("word: ");
//  不能使用下面这句,因为pT->data之前可能曾经很长
//  printf("%s",pT->data);
    for(int i = 0 ; i < strLength(pT);++i)
        printf("%c",pT->data[i]);
    printf("\n");
} 
时间: 2024-10-08 00:49:19

字符串的输入、输出、连接、拷贝、比较的相关文章

用指针对字符串输入/输出

#include<iostream> using namespace std; int main(void) { char *s=new char[80]; cout<<"输入一个字符串: "; cin>>s; getchar(); cout<<"输入的字符串是:"; cout<<s; getchar(); delete []s; s=NULL; } s是一个字符型指针变量,通过new运算符申请一个动态数组

0X04 字符串和格式化输入/输出

字符串(character string)就是一个或多个字符的序列.如:"hello world",双引号不是字符串的一部分,而是通知编译器,这是一个字符串. C没有为字符串定义专门的变量类型,而是把它存储在一个char数组中.该数组的单元数必须要比字符数多1,因为字符串在数组的最后一个位置会有\0. 在printf中用%s表示打印一个字符串. strlen()函数,以字符为单位给出字符串的长度.需要使用string.h头文件,该头文件中包含许多与字符串相关的函数原型. sizeof:

C语言的字符串转为OC中的字符串,控制台输入用户名和密码,判断输入的用户名是否是@“Frank”, 密码 是否是 @“lanou”, 如果用户名和密码都正确,则输出登录成功, 否则输出登录失败.

char name[20] = "";存储用户名 char code[20] = "";存储密码 printf("请输入用户名与密码"); scanf("%s%s", name, code); NSString *str1 = [NSString stringWithFormat:@"%s", name ]; NSString *str2 =[NSString stringWithFormat:@"

53.从键盘输入任意一串字符串,程序输出同样的一串字符,要求输出字符串中大小写相互转化,其他符号不变。如输入“a123BxC”,则输出“A123bXc”

(1)我的错误程序: #include<iostream> #include<string.h> using namespace std; int ZhuanHuan(char); int main() { char a[100]; cout<<"please input a string: "<<endl; cin>>a; for(int i=0;i<strlen(a);i++) { ZhuanHuan(a[i]);

[PTA]7-1 找最小的字符串 针对输入的N个字符串,输出其中最小的字符串(c++)

7-1 找最小的字符串 本题要求编写程序,针对输入的N个字符串,输出其中最小的字符串. 输入格式: 输入第一行给出正整数N:随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符. 输出格式: 在一行中用以下格式输出最小的字符串: Min is: 最小字符串 输入样例: 5 Li Wang Zha Jin Xian 输出样例: Min is: Jin 解答: 1 #include <iostream> 2 #include<string> 3 using

HeadFirstJava——12_序列化和文件的输入/输出

存储对象状态的方式: 1 序列化(若只有自己写的程序会用到这些数据) 创建一个文件,将被序列化的对象写入文件中,之后可在程序中到文件中读取序列化的对象并将其转换为状态: 注意:以文本文件形式阅读是无意义的: 2 写入纯文本文件中(若数据需要被其他程序引用) 创建一个文本文件,用其他程序可以解析的特殊字符写到文件中,每行写入一个对象的状态,用逗号/制表符分隔: 一.序列化 1 将序列化对象写入文件中 a 创建FileOutputStream 若MyGame.ser文件不存在,则自动被创建: 创建存

python基础(文件输入/输出 内建类型 字典操作使用方法)

本文主要介绍了python基础入门,包括文件输入/输出.内建类型.字典操作等使用方法 一.变量和表达式 代码如下: >>> 1 + 1 2>>> print 'hello world' hello world>>> x = 1               >>> y = 2>>> x + y3 Python是强类型语言,无法根据上下文自动解析转换成合适的类型. Python是一种动态语言,在程序运行过程中,同一个变量

Python输入/输出语句

Python输出语句print函数 print()函数基本使用 打印整形数据 打印浮点型数据 打印字符型数据 >>> print(12)12>>> print(12.5)12.5>>> print('B')B>>> print('WWW.baidu.com')WWW.baidu.com>>> x=12>>> print(12)12>>> y=12.88>>> pr

9、流类库与输入/输出

就像C语言一样,c++语言中也没有输入/输出语句.但c++编译系统带有一个面向对象的输入/输出软件爱你包,它就是I/O流类库. 1.I/O流的概念及流类库结构 I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品. 当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象. 流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动.程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对

将一个给定的字符串倒过来输出

344. Reverse String QuestionEditorial Solution My Submissions Total Accepted: 57497 Total Submissions: 97908 Difficulty: Easy Write a function that takes a string as input and returns the string reversed. Example:Given s = "hello", return "