这是我参加c语言比赛的机考试题,与大家分享下
第一题:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 30
/***********************************************
*函数名称: fun
*创建时间: 2010.12.5
*作 者: huangliangming
*描 述: 对一个字符串重新排列,字母排在前面,数字排在后面,并不改变原来字母之间以及数字之间的字符顺序。
*参 数: char * s,int *m
*返 回 值: chLetter(数组chLetter[]的首元素地址)
*局部变量: char chLetter[N];
* char chNumber[N];
* int i,j,k;
************************************************/
char * fun(char * s,int *m) //参数m是通过调试才想到的
{
char chLetter[N]; //用来存放字母
char chNumber[N]; //用来存放数字
int i,j,k;
i=0; //初始化
j=0; //j用来记录字母的个数
k=0; //k用来记录数字的个数
for (i=0; i<N; i++)
{
if (s[i] >= 'A' && s[i] <= 'Z' //将字母存入chLetter[]
|| s[i] >= 'a' && s[i] <= 'z')
{
chLetter[j]=s[i];
j++;
}
if (s[i] >= '0' && s[i] <='9') //将数字存入chNumber[]
{
chNumber[k]=s[i];
k++;
}
}
chLetter[j]='\0';
chNumber[k]='\0';
*m=j+k; //用来返回最后输入和输出时字符的个数
strcat(chLetter,chNumber);
return chLetter;
}
//主函数
void main()
{
char s[N];
int i;
int m;
char *p;
p=NULL;
printf("请输入字符串(30字符以内):\n");
scanf("%s",s);
p=fun(s,&m); //刚开始没定义出这个m来现限制指针p所指数组的长度就出现了后面两个字符乱码
for (i=0; i<m; i++) //将返回的值复制给数组以待输出
{
s[i]=p[i];
}
printf("结果为:");
for (i=0; i<m; i++) //输出结果
{
printf("%c",s[i]);
}
printf("\n");
}
第二题:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 30 //s所指字符串的最大长度
#define T 2 //t1和t2所指字符串的长度
/***********************************************
*函数名称: fun
*创建时间: 2010.12.5
*作 者: huangliangming
*描 述: 将s所指字符串中最后一次出现的与t1所指字符串相同的子串替换为t2所指字符串
*参 数: char * s,char * t1, char * t2,int *m
*返 回 值: w(数组w[]的首元素地址)
*局部变量: char w[N];
* char temp[T];
* char t1temp[T];
* int i,j,k,l;
************************************************/
char * fun(char * s,char * t1, char * t2,int *m) //m的作用和第一题一样,没m最后两个字符会乱码(想寻求其他方法)
{
char w[N]; //用来存放处理后的字符串
char temp[T]; //用来存放从s所指字符串中截取的子串
char t1temp[T]; //用来存放t1所指字符串
int i,j,k,l;
//向t1temp中存入t1所指字符串
for (i=0; i<T;i++)
{
t1temp[i]=t1[i];
}
t1temp[T]='\0';
//求m所指的值
for (i=0;i<N;i++)
{
if (s[i]=='\0')
{
*m=i;
}
}
//寻找相同时的最后一个字符的下标
for (i=0; i<N; i++)
{
l=0;
for (j=i; j<(i+T); j++,l++) //截取长度为T的子串存到temp[]中
{
temp[l]=s[j];
}
temp[T]='\0';
if (strcmp(t1temp,temp) == 0)
{
k=i; //k记录相同时的最后一个字符的下标
}
}
for (i=0; i<N; i++) //赋值给w[]
{
j=0;
if (i>=k && i<(k+T)) //在找到的k点处开始换值
{
w[i]=t2[j]; //换值
j++;
}
else
{
w[i]=s[i];
}
}
return w;
}
//主函数
void main()
{
char s[N];
char t1[T];
char t2[T];
int i;
int m;
char *p;
p=NULL;
printf("请输入字符串(20字符以内):");
scanf("%s",s);
printf("请输入将要被替换的子字符串(仅限两个字符):");
scanf("%s",t1);
printf("请输入将要用来替换的字字符串(仅限两个字符):");
scanf("%s",t2);
p=fun(s,t1,t2,&m);
for (i=0; i<m; i++) //将返回的值复制给数组以待输出
{
s[i]=p[i];
}
printf("结果为:");
for (i=0; i<m; i++) //输出结果
{
printf("%c",s[i]);
}
printf("\n");
}
第三题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 30
/***********************************************
*函数名称: fun
*创建时间: 2010.12.6
*作 者: huangliangming
*描 述: 将s所指的字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
*参 数: char * s,int * m
*返 回 值: return t,(t为指向数组的指针)
*局部变量: char * t;
* char temp[N];
* int i,j=0;
************************************************/
char * fun(char * s,int * m)
{
char * t;
char temp[N]; //临时的数组,用来存放t所指的数组
int i,j=0;
t=temp;
for (i=0; i<N; i++)
{
if (s[i]%2==0 )
{
temp[j]=s[i]; //如果是偶数,赋值给t所指的数组
j++;
if (s[i]=='\0') //找到m的值先要找出输入了多少个字符
{
break;
}
}
}
*m=j; //找到m的值即输出结果的长度
t[j]='\0';
return t;
}
//主函数
void main()
{
char s[N];
int i;
int m;
char *p;
p=NULL;
printf("请输入字符串(30字符以内):\n");
scanf("%s",s);
p=fun(s,&m); //刚开始没定义出这个m来现限制指针p所指数组的长度就出现了后面两个字符乱码
for (i=0; i<m; i++) //将返回的值复制给数组以待输出
{
s[i]=p[i];
}
printf("结果为:");
for (i=0; i<m; i++) //输出结果
{
printf("%c",s[i]);
}
printf("\n");
}
如果有什么问题的话就讨论下吧
作者:涵曦(www.hanxi.cc)
出处:hanxi.cnblogs.com
GitHub:github.com/hanxi
Email:im.hanxi@gmail.com
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
《 Skynet 游戏服务器开发实战》
-
学习地址:
-
优惠推荐码:
2CZ2UA5u -
可以先免费试学前 2 章内容

浙公网安备 33010602011771号