C语言 实验九 字符串
可加const防止数组指针所指向的内容被修改导致main函数数组值发生改变
有谁知道第四题还有其他方法用指针表示吗?
一、实验目的
1.掌握字符串的输入输出格式以及不同输入输出方法之间的区别。
2. 掌握字符串的复制、连接、比较等常用的字符串处理函数。
3.掌握字符指针的用法。
二、实验学时
2 学时
三、实验内容
1.定义一个字符数组,分别用 getchar()/putchar()、scanf(“%s”,…)/
printf(“%s”,…)、gets()/puts()语句输入输出,分析三种输入输出方法的
区别。
2.输入一个字符串,逆序输出这个字符串(最后的字符最先输出)。如输入
“abcdef”,输出“fedcba”
3.自编一个字符串的连接函数(和 strcat 功能一样),用指针实现。
4.自编一个字符串的比较函数(和 strcmp 功能一样),用指针实现。
5. 从键盘输入一个字符串,将此字符串中从第 m 个字符开始的 n 个字符复制成
另一个字符串并输出显示(其中 m 和 n 值从键盘输入)。
6. 从键盘输入 5 个字符串,输出显示最长的字符串。
7.编写程序判断一个字符串是否回文字符串,若是回文,则输出“YES“,否则
输出“NO”。回文字符串:是一个正读和反读都一样的字符串。
①用getchar()/putchar():
#include<stdio.h>
main( )
{
int i=0;
char x[100];
printf("输入一行字符:");
do
{
x[i]=getchar();
putchar(x[i]);
i++;
}
while(x[i]!='0');
}
可以输入空格符和制表符,但只能一个一个的输入读取输出,遇到换行符停止读取。若要输出一行字符,则需要用循环结构。
②用scanf(“%s”,…)/printf(“%s”,…):
#include<stdio.h>
main( )
{
int i=0,j=0;
char x[100];
printf("输入一行字符:");
scanf("%s",&x);
printf("%s",x);
}
用scanf输入字符串时,%s格式说明是以用空格、回车符、制表符等间隔符表示字符串输入结束。因此输入一个字符串时,其中不能包含空格字符。要将包含空格符的字符串输入到字符数组中,必须用字符串输入函数:gets函数。或用%c格式进行单个字符的输入,这个可以输入回车符,但若要输入字符串,则要循环结构。
③用gets()/puts():
#include<stdio.h>
#include<string.h>
main( )
{
char x[100];
printf("输入一行字符:");
gets(x);
puts(x);
}
gets函数则能从终端键盘读入字符串(包含空格符),直到读入一个换行符为止。但源文件include命令行中应该包含头文件名string.h。
①将字符串逆序放在另一个数组
#include<stdio.h>
#include<string.h>
#define N 100
main( )
{
int i,j=0,s;
char x[N],p[N];
printf("输入一个字符串:");
gets(x);
s=strlen(x);
for(i=s-1;i>=0;i--)
p[j++]=x[i];
puts(p);
}
②将字符串中关于中心对称位置字符交换位置
#include<stdio.h>
#include<string.h>
#define N 100
main( )
{
int i,j,s;
char x[N],p;
printf("输入一个字符串:");
gets(x);
s=strlen(x);
for(i=s-1,j=0;i>=s/2/*或i>s/2-1或i!=s/2-1*/;i--,j++)
p=x[i],x[i]=x[j],x[j]=p;
puts(x);
}
③让后面的数往前不断移位,直至最后一位移到第一位、新的最后一位移到第二位……
#include<stdio.h>
#include<string.h>
#define N 100
main( )
{
int i,j,s;
char x[N],p;
printf("输入一个字符串:");
gets(x);
s=strlen(x);
for(j=s-1;j>0;j--)
for(i=s-1;i>s-j-1;i--)
p=x[i],x[i]=x[i-1],x[i-1]=p;
puts(x);
}
①用数组下标移动
#include<stdio.h>
#include<string.h>
#define N 100
char *lj(char *p,char q[])
{
int i,a,b;
a=strlen(p);b=strlen(q);
for(i=0;i<b;i++)
p[a+i]=q[i];
return p;
}
main( )
{
char m[2*N],n[N];
printf("输入两个字符串m,n:");
scanf("%s%s",m,n);
//或者 printf("连接后的字符串:\n%s",lj(m,n));
lj(m,n);
printf("连接后的字符串:\n%s",m);
}
②用指针移动
#include<stdio.h>
#define N 100
void lj(char *p,char *q)
{
int i,a,b;
while(*p!='\0') //将指针移到末尾
p++;
//将q字符串复制到字符串p后面
for(;*q!='\0';p++,q++)
*p=*q;
*p='\0';
}
main( )
{
char m[2*N],n[N];
printf("输入两个字符串m,n:\n");
scanf("%s%s",m,n);
lj(m,n);
printf("连接后的字符串:\n%s",m);
}
#include<stdio.h>
#include<string.h>
#define N 100
void bj(char p[],char q[],int *x)
{
int i=0,j;
j=strlen(p);
while((*x=p[i]-q[i])==0)
{
if(i==j)break;
i++;
}
}
main( )
{
int x;
char m[N],n[N];
printf("输入两个字符串m,n:");
scanf("%s%s",m,n);
bj(m,n,&x);
if(x>0)
printf("m>n");
else if(x<0)
printf("m<n");
else
printf("m=n");
}
①用数组下标移动
#include<stdio.h>
#include<string.h>
#define N 100
main( )
{
char a[2*N],b[N];
int m,n,i,j=0;
printf("输入一个字符串a:\n");
gets(a);
printf("将输出此字符串第 m 个字符开始的 n 个字符\n请输入m,n:\n");
scanf("%d,%d",&m,&n);
for(i=m-1;i<m+n-1;i++)
b[j++]=a[i];
printf("输出结果为:\n%s",b);
}
②用指针移动
#include<stdio.h>
#include<string.h>
#define N 100
main( )
{
char a[2*N],b[N],*p=a,*q=b;
int m,n,i,j;
printf("输入一个字符串a:\n");
gets(a);
printf("将输出此字符串第 m 个字符开始的 n 个字符\n请输入m,n:\n");
scanf("%d,%d",&m,&n);
for(i=1;i<m;i++,p++);
for(j=0;j<n;j++)
*q++=*p++;
printf("输出结果为:\n%s",b);
}
#include<stdio.h>
#include<string.h>
#define N 100
main( )
{
char p[5][N],*q;
int i;
printf("请输入五个字符串:");
scanf("%s",p[0]);
q=p[0];
for(i=1;i<5;i++)
{
scanf("%s",p[i]);
if(strlen(q)<strlen(p[i]))
q=p[i];
}
printf("max=%s",q);
}
①将字符串逆序复制到另外一个数组,比较两者每个字符的大小
#include<stdio.h>
#include<string.h>
#define N 100
void bj(char p[],char q[],int *x)
{
int i=0,j;
j=strlen(p);
while((*x=p[i]-q[i])==0)
{
i++;
if(i==j)break;
}
}
main( )
{
char p[N],q[N];
int i,j=0,s,x;
printf("请输入一个字符串:");
scanf("%s",p);
s=strlen(p);
for(i=s-1;i>=0;i--)
q[j++]=p[i];
bj(p,q,&x);
if(x==0)
printf("YES");
else
printf("NO");
}
②将字符串逆序复制到另外一个数组,用strcmp比较两者大小
#include<stdio.h>
#include<string.h>
#define N 100
main( )
{
char p[N],q[N];
int i,j=0,s,x;
printf("请输入一个字符串:");
scanf("%s",p);
s=strlen(p);
for(i=s-1;i>-2;i--)
q[j++]=p[i];
if(strcmp(p,q)!=0)
printf("NO");
else
printf("YES");
}
③一个个判断关于字符串中心对称位置的字符是否相等
#include<stdio.h>
#include<string.h>
#define N 100
main( )
{
char p[N];
int i,j,s,x=0;
printf("请输入一个字符串:");
scanf("%s",p);
s=strlen(p);
for(i=s-1,j=0;i>0/*i>=s/2或i!=s/2-1或i>s/2-1*/;i--,j++)
if(p[i]!=p[j])
x=1;
if(x==0)
printf("YES");
else
printf("NO");
}