将以下练习题全用指针实现
1、把所有小写字母换成大写字母。(输入ABcDEfgH 输出 ABCDEFGH)
//代码参考
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *str = (char *)malloc(128);
scanf("%s",str);
char *begin = str;
while(*str != '\0'){
if(*str>97 && *str<122)
*str-=32;
str++;
}
printf("%s\n",begin);
free(begin);
begin = NULL;
return 0;
}
2、去掉字符串中的空格。(输入abcd ef g hijk 输出 abcdefghijk)
//代码参考
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void delete_space(char *str)
{
while(*str != '\0')
{
*str=*(str+1);
str++;
}
}
int main()
{
char *str = (char *)malloc(128);
char ch;
int i=0;
while((ch=getchar()) != '\n'){
*(str+i++)=ch;
}
char * begin = str;
while(*str != '\0')
{
if(*str == ' ')
{
delete_space(str);
}
else
{
str++;
}
}
printf("%s\n",begin);
free(begin);
begin = NULL;
return 0;
}
3、判断一个字符串是不是回文。(输入abcdedcba)
//代码参考
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *str = (char *)malloc(128);
char ch;
static int i=0;
while((ch = getchar()) != '\n')
{
*(str + i++) = ch;
}
/*********************************************
*方法一
char *begin = str;
while(*begin != '\0')
{
if(*begin != *(str+ --i)){
printf("it is not\n");
return 0;
}
begin++;
}
printf("it is\n");
**********************************************/
// 法二
int k=0;
for(k=0;k<(i/2);k++){
if(str[k] != str[i-k-1])
{
printf("it is not\n");
return 0;
}
}
printf("it is\n");
free(str);
str = NULL;
return 0;
}
4、给定字符串A 和 B,输出A 和 B中的最大公共子串。(A = ‘aocdfe’ B=‘pmcdfa’ 输出’cdf’)
//参考代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *logest_comman_substring(char *str1, char *str2)
{
int str1len = strlen(str1);
int str2len = strlen(str2);
int max=0;
int num=0;
int start;
for(int i=0;i<str1len;i++)
for(int j=0; j<str2len;j++)
{
int start1 = i;
int start2 = j;
while((start1<=str1len-1) && (start2<=str2len-1)&&(str1[start1++] == str2[start2++]))
num++;
if(num>=max)
{
max = num;
start = i;
}
num=0;
}
char *str = (char *)malloc(max+1);
strncpy(str,str1+start,max);
str[max]='\0';
return str;
}
int main()
{
char *str = (char *)malloc(32);
char *str1 = (char *)malloc(32);
int i=0,j=0;
char ch;
printf("input A:");
while((ch=getchar()) != '\n'){
*(str + i++)=ch;
}
printf("input B:");
while((ch=getchar()) != '\n'){
*(str1 + j++)=ch;
}
printf("最大公共字串:");
char* str2 = logest_comman_substring(str,str1);
printf("%s\n",str2);
free(str2);
str2 = NULL;
return 0;
}
5、编写一个C函数,将“I am from shanghai" 倒置为"shanghai from am I",即将句子中的单词位置倒置,而不改变单词内部结构。
//代码参考
#include<stdio.h>
#include<stdlib.h>
#define SIZE 4
int main()
{
char *str[SIZE]={0};
int i;
for(i=0;i<SIZE;i++)
{
str[i] = (char *)malloc(sizeof(char *) * 16);
scanf("%s",str[i]);
}
char *tmp;
for(i=0;i<SIZE/2;i++)
{
tmp = str[i];
str[i] = str[SIZE-1-i];
str[SIZE-1-i] = tmp;
}
for(i=0;i<SIZE;i++)
{
printf("%s ",str[i]);
free(str[i]);
}
printf("\n");
return 0;
}
6、输入一个字 符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来。(提示:帧头和帧尾分别是head和tail,字符串"asdheadhauboisoktail" 中headhauboisoktail是合法帧)
//代码参考
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *str = (char *)malloc(128);
scanf("%s",str);
while(*str != '\0')
{
if(*str == 'h' && *(str+1) == 'e' && *(str+2) == 'a' && *(str+3) == 'd')
{
char *begin = str;
while(*begin != '\0')
{
if(*begin == 't' && *(begin+1) == 'a' && *(begin+2) == 'i'&& *(begin+3) == 'l')
{
while( !((str+1)==(begin+5)))
{
printf("%c",*str);
str++;
}
*begin = '\0';
}
begin++;
}
}
str++;
}
putchar('\n');
return 0;
}
7、找出字符串中第一个不重复的字符。(如输入google,输出l,l是第一个不重复的字符)
//代码参考
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *str = (char *)malloc(32);
scanf("%s",str);
int len=strlen(str);
int i,j;
for(i=0;i<len;i++)
{
for(j=0;j<len;j++)
{
if(str[i] == str[j] && i != j)
{
break;
}
}
if(j == len)
{
printf("%c\n",str[i]);
break;
}
}
return 0;
}
8、向左旋转字符。(输入XYZabcdef 3,输出abcdefXYZ, 及字符串向左移动三位,前面的接到后面)
//代码参考
//代码参考
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int num,i=0;
char *str = (char *)malloc(32);
char *tmp = (char *)malloc(32);
scanf("%s",str);
scanf("%d",&num);
int len = strlen(str);
int j=0;
char *start = str;
while(*str != '\0')
{
if(i<num)
{
tmp[i] = *(str+len-num);
*(str+len-num)=*str;
}else{
if(*str == 'X' || *str == 'Y' || *str == 'Z')
{
*(str-num) = tmp[j];
j++;
}else
{
*(str-num) =*str;
}
}
i++;
str++;
}
printf("%s\n",start);
free(start);
return 0;
}
结语:
以上内容都是由个人整理,有问题的话,欢迎留言指出。