1.题目: 请编写一个C函数,该函数将一个字符串逆序
#include <stdio.h>
#include <string.h>
void exc(char *str)
{
int n;
int temp; //设中间变量用于交换值
int len = strlen(str);
for (n = 0; n < len / 2; n++) //位置的左右调换执行到len/2即倒序一遍,若执行len长度则倒序两遍回到最初状态
{
temp = *(str + n);
*(str + n) = *(str + len - n - 1);
*(str + len - n - 1) = temp;
}
}
int main() //封装函数
{
char a[50] = {
0};
printf("输入你想翻转的字符串:\n");
scanf("%s", a); //也可写成gets(a);不过程序会报警告
exc(a);
printf("%s\n", a);
}
2.请编写一个C函数,该函数可以实现将一个整数转为任意进制的字符串输出
#include <stdio.h>
#include <string.h>
void change(int a, int b, char *str)
{
for (; a != 0;) //将a按位输出,也可用while循环实现
{
if (a % b < 10) //取末位的值,小于10就用十进制表示
{
*(str++) = a % b + '0';
}
else //大于10用字母表示
{
*(str++) = a % b + 'A' - 10; }
a = a / b; //整数向后移一位
}
*str = '\0';//字符串一直在执行"++"操作,所以最后一次的自加未赋值,赋为\0(字符串的结尾)
}
void exc(char *str) //因为按位输出a的值是从个位向高位转换,所以转换后的字符是逆序的,定义一个函数exc将其倒回正序
{
int n;
char a;
for (n = 0; n < strlen(str) / 2; n++)
{
a = *(str + n);
*(str + n) = *(str + strlen(str) - n - 1);
*(str + strlen(str) - n - 1) = a;
}
}
int main()
{
int a;
int b;
char str[100] = {
0};
printf("输入要转化的整数 :\n");
scanf("%d", &a);
printf("输入转化进制 :\n");
scanf("%d", &b);
change(a, b, str);
exc(str);
printf("转化结果为 :\n%s\n", str);
return 0;
}
3.题目: 输入一个字符串,计算字符串中子串出现的次字数
#include <stdio.h>
#include <string.h>
int countsrc(char *mum, char *son)
{
int count = 0;
while (*mum != '\0') //while循环遍历整个字符串
{
if (strncmp(mum, son, strlen(son)) == 0) //判断strncmp的返回值实现子串查找
{
mum += strlen(son); //查找成功,字符串后移一个子串的长度
count = count + 1; //计数器count+1
}
mum++;
}
if (count == 0)
{
printf("字符串中无所需子串\n");
}
if (count != 0)
{
printf("字符串中子串个数为 :\n%d\n", count);
}
return 0;
}
int main()
{
char str1[50] = {
0}; //母串
char str2[10] = {
0}; //子串
printf("输入字符串 :\n");
scanf("%s", str1);
printf("输入子串 :\n");
scanf("%s", str2);
countsrc(str1, str2);
return 0;
}
4.题目: 编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,即将句子中的单词位置倒置,而不改变单词内部结构.
#include <stdio.h>
#include <string.h>
void exc1(char *str, int len)
{
int n;
char temp;
for (n = 0; n < len / 2; n++) //第一题的思想:字符串逆序
{
temp = *(str + n);
*(str + n) = *(str + len - n - 1);
*(str + len - n - 1) = temp;
}
}
void exc2(char *str) //母串中每个子串分别逆序
{
int n;
int i = 0;
int start = 0;
char *temp = str;
for (n = 0; n < strlen(str); n++)
{
if (*(temp + n) != ' ' && *(temp + n) != '\0') //遍历整个字符串
{
i = i + 1;
}
else //将空格与空格之间的字符串视为一个子串,子串内部逆序
{
exc1(str + start, i);
start = start + i + 1;
i = 0;
}
}
}
int main()
{
int i;
char a[] = "i am from shanghai";
printf("%s\n", a);
exc1(a, strlen(a));
exc2(a);
printf("%s\n", a);
return 0;
}
5.题目: 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhauboisoktail是合法帧
#include <stdio.h>
#include <string.h>
int findsrc(char *str, char *head, char *tail)
{
char *temp = {
0}; //初始化识别串
while (*str != '\0') //遍历字符串
{
if (strncmp(str, head, strlen(head)) == 0) //第三题思想:判断strncmp返回值
{
temp = str;
str += strlen(head);
while (*str != '\0')
{
if (strncmp(str, tail, strlen(tail)) == 0)
{
*(str + strlen(tail)) = '\0'; //给一直自加的str字符串加"/0"结尾
printf("字符串中合法帧为 :\n%s\n", temp);
return 0;
}
str++; //若字符串识别帧头后遍历到结尾仍未识别到帧尾,则没有帧尾
}
printf("没找到帧尾!\n");
break;
}
else
{
str++;
}
if (*str == '\0' && temp == 0) //若遍历到结尾,识别串仍为空则没有帧头
{
printf("没有找到帧头!\n");
}
}
return 0;
}
int main()
{
char str[100] = {
0};
char head[10] = {
0};
char tail[10] = {
0};
printf("输入字符串 :\n");
scanf("%s", str);
printf("输入帧头 :\n");
scanf("%s", head);
printf("输入帧尾 :\n");
scanf("%s", tail);
findsrc(str, head, tail);
return 0;
}
注释添加于2021.02.06 00:57