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的首地址 */
}