C字符串数组练习

字符串数组

初始化方式

#include <stdio.h>
#include <string.h>
int main(){
	/*方式一*/
	char string1[20]={'\0'};//常用初始化
	printf("strig1:%s\n",string1);//%s输出字符串,自动读到'\0'结束
	
	/*方式二*/
	char string2[]={'H','e','l','l','\0','o'};//不推荐,不给确定大小则最终大小以后面括号内容决定,且不自动加'\0'
	printf("strig2:%s,size:%d\n",string2,sizeof(string2));  //strig2:Hell,size:6
	
	/*方式三*/
	char string3[20]="";//直接空字符串初始化,不推荐
	printf("please input:");
	scanf("%s",string3);//遇到空格和回车停止,其余内容仍在缓存中
	while(getchar()!='\n');//清缓存一定要在上一个输出之后清除,免得出现异常
	printf("strig3:%s\n",string3);
	
	/*方式四*/
	char string4[100]="hello world";
	
	/*方式五*/
	char string5[1024];
	memset(string5,0,sizeof(string5));//因为是字符,所以还可以写成memset(string5,0,1024);
	printf("please input:");
	gets(string5);//整行的输入
	printf("string5:");
	puts(string5);//puts无法做到像printf那样的输出效果
	
}

题1 交换大小写,按ASCII码排序



#include <stdio.h>
#include <string.h>
#define SIZE 25

void string_output(char *);
void string_pick(char *p);
void string_sort(char *p);
void swap(char *p1,char *p2);

int main(int argc, char **argv)
{
	char string[SIZE]={'\0'};
	printf("请输入%d个字符串:",SIZE);
	//gets(string); //不限制输入字符个数,会有越界操作的风险出现段错误,推荐使用fgets()
	fgets(string,SIZE,stdin);//会读入最后的换行符'\n'
	
	printf("输入的字符串为:");
	string_output(string);
	
	printf("大小写互换后的字符串为:");
	string_pick(string);
	string_output(string);
	
	printf("按ASCII码排序后的字符串为:");
	string_sort(string);
	string_output(string);
	return 0;
}

void string_output(char *p){
	for(int i=0;i<strlen(p)-1;++i)printf("%c",p[i]); // i<strlen(p)-1 去掉输入数组末尾的'\n'换行符
	printf("\n");
	}
#if 0
void string_pick(char *p){
	/*将大小写和数字分开放置输出*/
	char number[1024]={'\0'},big[1024]={'\0'},small[1024]={'\0'};
	int i=0,num_index=0,big_index=0,small_index=0;
	for(i=0;i<SIZE;++i){
		if(p[i]>='0'&&p[i]<='9')number[num_index++]=p[i];
		else if(p[i]>='a'&&p[i]<='z')big[big_index++]=p[i];
		else if(p[i]>='A'&&p[i]<='Z')small[small_index++]=p[i];
		}
	string_output(number);
	string_output(big);
	string_output(small);
	
	}
#endif
#if 1
void string_pick(char *p){
	/*将小写字母变大写或相反*/
	int i=0;
	for(i=0;i<strlen(p);++i){
		if(p[i]>='a'&&p[i]<='z')p[i]-=32;
		else if(p[i]>='A'&&p[i]<='Z')p[i]+=32;
		}
	}
#endif
#if 1
void string_sort(char *p){
	/*按ASCII码排序*/
	int i=0,j=0;
	for(i=0;i<strlen(p)-1;++i){
		for(j=0;j<strlen(p)-2;++j)
			if(p[j]>p[j+1])swap(&p[j],&p[j+1]);
		}
		
	}
void swap(char *p1,char *p2){
	char temp;
	temp=*p1;*p1=*p2;*p2=temp;
	}
#endif


优化fgets函数

void mygetstr(char*);

void mygetstr(char*str){
	int len;
	printf("请输入一个字符串:");
	while(1){
		fgets(str,SIZE,stdin);
		if(*str=='\n'){
			 printf("没有输入!请重新输入:");continue;
			 }
		break;
		}
	len=strlen(str);
	
	if(str[len-1]=='\n')str[len-1]='\0';  //去掉fgets输入的'\n'
	else while(getchar()!='\n'); 

	return len-1;  //返回长度
}

题2:从键盘输入的一行字符,统计其中单词的个数。假设单词之间以非英文字符为分隔

/*2021-04-02
 * 题1:从键盘输入的一行字符,统计其中单词的个数。假设单词之间以非英文字符为分隔
 示例:
 
	请输入一个字符串:do you love me?
	输入字符串中有4个单词。
 */
#include <stdio.h>
#include <string.h>
#define SIZE 20
void mygetstr(char*);
int words(char*);
int adj(char ch);

int main(int argc, char **argv)
{
	char str[SIZE]={'\0'};
	mygetstr(str);
	printf("输入字符串中有%d个单词。\n",words(str));
	
	return 0;
}

void mygetstr(char*str){
	int len;
	printf("请输入一个字符串:");
	while(1){
		fgets(str,SIZE,stdin);
		if(*str=='\n'){
			 printf("没有输入!请重新输入:");continue;
			 }
		break;
		}
	len=strlen(str);
	
	if(str[len-1]=='\n')str[len-1]='\0'; //去掉fgets输入的'\n'
	else while(getchar()!='\n'); 
}

int words(char*s){
	/*查找单词,若是字母则判断后一位是不是非字母,若是则判断为单词,若不是则继续判断*/
	char*p;
	int count=0;
	for(p=s;*p!='\0';p++){ 
		if(adj(*p)){  
			if(!adj(*(p+1)))count++; 
			}
		}
	return count;
	}

int adj(char ch){
		if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))return 1;
		else return 0;
	}

题3:用户输入一行字符串,统计此字符串中每一个小写字母出现的次数

/*2021-04-02
 * 用户输入一行字符串,统计此字符串中每一个小写字母出现的次数
	input a string: abckckchcAD
	a:1
	b:1
	c:4
	h:1
	k:2
 */


#include <stdio.h>
#include <string.h>
#define SIZE 20
int count(char*s,char i);
void mygetstr(char*str);
int main(int argc, char **argv)
{
	char s[SIZE]={'\0'};
	mygetstr(s);
	char i;int num=0,inter=0;
	for(i='a';i<='z';i++)
	if((num=count(s,i))){printf("%c有%d个\n",i,num);inter++;}
	if(!inter)printf("字符串里没有小写字母!\n");
	
	return 0;
}

int count(char*s,char i){
	char*p;
	int count=0;
	for(p=s;*p!='\0';p++){
			if(*p==i)count++;
		}
	return count;
}

void mygetstr(char*str){
	int len;
	printf("请输入一个字符串:");
	while(1){
		fgets(str,SIZE,stdin);
		if(*str=='\n'){
			 printf("没有输入!请重新输入:");continue;
			 }
		break;
		}
	len=strlen(str);
	
	if(str[len-1]=='\n')str[len-1]='\0'; //去掉fgets输入的'\n'
	else while(getchar()!='\n'); 
}

题4:自定义函数实现 strlen strcpy strcat strcmp

/*文件名:strfunc.h*/


/*strlen
 * 求字符串长度*/
int strlength(char *s1);

/*strcpy
 * 将s2复制给s1*/
char *strcopy(char *s1, char *s2);

/*strcat
 * 将s2加到s1末尾*/
char *strconnect(char *s1, char *s2,int size);

/*strcmp
 * 比较两字符串大小*/
int strcompare(char *s1, char *s2);


==============================


/*文件名:strfunc.c*/

/* 自定义函数实现 strlen strcpy strcat strcmp
*/

#include "strfunc.h"


/*strlen
 * 求字符串长度*/
int strlength(char *s1){
	int num=0;
	for(; *s1; s1++, num++) ;  //num加加直到s1为空结束,不记入空
	return num;
}

/*strcpy
 * 将s2复制给s1*/
char *strcopy(char *s1, char *s2){
	
	char *p1, *p2;
	for(p1=s1,p2=s2; (*p1=*p2);  //每次赋值之后再判断是否为空,直到p2将空值赋给p1后结束
													p1++,p2++); //每次指针加1
	return s1;
}

/*strcat
 * 将s2加到s1末尾*/
char *strconnect(char *s1, char *s2, int size){  
	
	char *p1, *p2;	
	p1=s1; while(*p1)p1++;				
	for(p2=s2; (p1<(s1+size)&&(*p1=*p2)); p1++,p2++);
	return s1;
}

/*strcmp
 * 比较两字符串大小*/
int strcompare(char *s1, char *s2){
	
	char *p1,*p2; p1=s1,p2=s2;
	do{ if(*p1!=*p2) return (*p1>*p2);}
	while(++p1,++p2,*p1||*p2);                //当两个指针都到末尾空时退出,为相等
	return -1;

}

============================================

/*文件名:strfunc_test.c*/

#include <stdio.h>
#include "strfunc.h"
#define SIZE 30
void compare(char *s1,char *s2);
int main(){

	char *s1= "hallo morning";
	char s2[SIZE] = {'\0'};            //字符数组的初始化定义
	
	printf("=%s= len:%d \n", s1, strlength(s1) );
	printf("s2: %s \n", strcopy(s2, s1));
	compare(s1,s2);
	
	printf("s2+s1: %s \n", strconnect(s2, s1,SIZE));
	printf("s2++s1: %s \n", strconnect(s2, s1, SIZE));
	printf("s2+++s1: %s \n", strconnect(s2, s1,SIZE));
	printf("s2++++s1: %s \n", strconnect(s2, s1,SIZE));
	compare(s1,s2);
	
	printf("s1:%s\ns2:%s\n",s1,s2);
	printf("after copy, s2: %s \n", strcopy(s2, s1));
	compare(s1,s2);
}

void compare(char *s1,char *s2){
	if(strcompare(s2, s1)==0)printf("s2<s1 \n");
	if(strcompare(s2, s1)>0)printf("s2>s1 \n");
	if(strcompare(s2, s1)<0)printf("s2=s1 \n");
}


===========================================

输出:
=hallo morning= len:13 
s2: hallo morning 
s2=s1 
s2+s1: hallo morninghallo morning 
s2++s1: hallo morninghallo morninghall 
s2+++s1: hallo morninghallo morninghall 
s2++++s1: hallo morninghallo morninghall 
s2>s1 
s1:hallo morning
s2:hallo morninghallo morninghall
after copy, s2: hallo morning 
s2=s1 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值