字符数组&字符指针

1、奥运参赛国按字母顺序排序

#include  <stdio.h>
#include  <string.h>
#define   MAX_LEN  10  //字符串最大长度 
#define   N         150 //字符串个数 
void SortString(char str[][MAX_LEN], int n);

int main()
{ 
	int    i, n;
	char   name[N][MAX_LEN]; //定义二维字符数组 
	
	printf("How many countries?");
	scanf("%d",&n);
	getchar(); //读走输入缓冲区中的回车符 
	
	printf("Input their names:\n");
	for (i=0; i<n; i++)   
		gets(name[i]); //输入n个字符串 
	
	SortString(name, n); //字符串按字典顺序排序 
	
	printf("Sorted results:\n");
	for (i=0; i<n; i++)                     
		puts(name[i]); //输出排序后的n个字符串 
	
	return 0;
}
//函数功能:交换法实现字符串按字母顺序排序 
void SortString(char str[][MAX_LEN], int n)
{
	int    i, j;
	char  temp[MAX_LEN];
	
	for (i=0; i<n-1; i++)         			
		for (j = i+1; j<n; j++)
			if (strcmp(str[i], str[j]) > 0)     
			{
			  	strcpy(temp,str[i]);        
				strcpy(str[i],str[j]);
				strcpy(str[j],temp);
			}  			
}

2、不用strcpy(),实现其功能:将str2复制到字符数组str1中,以“\0”作为结束标志

方法1——字符数组作函数形参

#include  <stdio.h>
#define N 80
void  MyStrcpy(char dstStr[], char srcStr[]);

int main()
{ 
	char  a[N], b[N]; 
	
	printf("Input a string:");
	gets(a); /* 输入字符串 */
	
	MyStrcpy(b, a); /* 将字符数组a中的字符串拷贝到b中 */
	
	printf("The copy is:");
	puts(b);  /* 输出复制后的字符串 */
	
	return 0;
}
/* 函数功能:用字符数组作为函数参数实现字符串拷贝 */
void  MyStrcpy(char dstStr[], char srcStr[])  
{
	int  i = 0; 
	
	while (srcStr[i] != '\0')
	{ 
		dstStr[i] = srcStr[i];/* 复制字符 */
		i++;  
	}
	
	dstStr[i] = '\0'; /* 在字符串dstStr的末尾添加字符串结束标志 */  
}

方法2——字符指针作函数形参

void  MyStrcpy(char *dstStr, char *srcStr);

/* 函数功能:用字符指针作为函数参数,实现字符串拷贝 */
void  MyStrcpy(char *dstStr, char *srcStr)
{
	while (*srcStr != '\0')	/* 若当前srcStr所指字符不是字符串结束标志 */
	{ 
		*dstStr = *srcStr; 	/* 复制字符 */
		srcStr++; /* 使srcStr指向下一个字符 */
		dstStr++; /* 使dstStr指向下一个存储单元 */
	}
	
	*dstStr = '\0'; /* 在字符串dstStr的末尾添加字符串结束标志 */
}

3、不用strlen(),实现其功能:计算并返回字符串的实际长度

方法1——字符数组作函数形参

#include  <stdio.h>
unsigned int  MyStrlen(const char str[]);

int main()
{
	char   a[80];
	
	printf("Input a string:");
	gets(a);   
	               
	printf("The length of the string is: %u\n", MyStrlen(a));
	
	return 0;
}
/* 函数功能:用字符型数组作函数参数,计算字符串的长度 */
unsigned int  MyStrlen(const char str[])
{ 
	int  i ;
	unsigned int len = 0;/* 计数器置0 */
	
	for (i=0; str[i]!='\0'; i++)  
		len++; 
	
	return len; /* 返回实际字符个数 */
} 

方法2——字符指针作函数形参 (防止实参在被调函数中被意外修改,可在相应形参前加上const)

unsigned int  MyStrlen(const char *pStr);

/* 函数功能:用字符指针作函数参数,计算字符串的长度 */
unsigned int  MyStrlen(const char *pStr)
{ 
	unsigned int  len = 0; /* 计数器置0 */
	
	for ( ; *pStr!='\0'; pStr++)  
		len++;                
	
	return len; /* 返回实际字符个数 */
} 

4、不用strcat(),实现其功能:将str2复制到str1后,返回str1的首地址

方法1——字符指针作函数形参

#include  <stdio.h>
#define N 80
char *MyStrcat(char *str1, char *str2);

int main()
{
	char first[2*N]; /* 这个数组应该足够大,以便存放连接后的字符串 */
	char second[N];
	
	printf("Input the first string:");
	gets(first);
	
	printf("Input the second string:");
	gets(second);
	
	printf("The result is: %s\n", MyStrcat(first, second));
	
	return 0;
}
/* 函数功能:将str2连接到str1的后面 */
char *MyStrcat(char *str1, char *str2)
{
	char *pStr = str1; /* 保存str1的首地址 */
	
	while (*str1 != '\0')//将指针移到str1末尾 
		str1++;  		
	/* 将str2复制到str1的后面 */
	for(; *str2!='\0'; str1++, str2++)
		*str1 = *str2;
		
	*str1 = '\0'; /* 在str1的末尾添加字符串结束标志 */
	
	return pStr; /* 返回str1的首地址 */
}

方法2——字符数组作函数形参

#include  <string.h>
char *MyStrcat(char str1[], char str2[]);

/* 函数功能:将str2连接到str1的后面 */
char *MyStrcat(char str1[], char str2[])
{
	int i, j;
	/* 将str2复制到str1的后面 */
	for(i=strlen(str1), j=0; str2[j]!='\0'; )
		str1[i++]=str2[j++];
		
	str1[i] = '\0';  /* 在str1的末尾添加字符串结束标志 */
	
	return str1;  /* 返回str1的首地址 */
}
发布了23 篇原创文章 · 获赞 7 · 访问量 1996

猜你喜欢

转载自blog.csdn.net/weixin_44641176/article/details/99999848