一、判断题
1、
答案:T
解析:
strcmp函数介绍:
(1)作用:用来比较字符串的大小
(2)比较机制:
- 如果字符串1的第n位的ASCII码值等于字符串2的第n位的ASCII码值则继续比较下一位
- 如果字符串1的第n位的ASCII码值大于字符串2的第n位的ASCII码值则输出结果:1 表示字符串1 > 字符串2(实际上返回值应该是字符串1的ASCII值-字符串2的ASCII值)
- 如果字符串1的第n位的ASCII码值小于字符串2的第n位的ASCII码值则输出结果:-1 表示字符串1 <字符串2(实际上返回值应该是字符串1的ASCII值-字符串2的ASCII值)
也就是说相应位置上的差值为0的话,继续比较;如果差值大于0的话,返回该大于0的数;如果差值小于0的话,返回该小于0的数。
2、
答案:F
解析:
字符串常量
(1)char数组或者char指针
(2)结束标志符:'\0',千万不要忘记\
3、
答案:T
解析:
char *str和char str[]之间的区别
(1)在C语言中字符串常量的本质表示其实是一个地址(“China”这种的就是字符串常量)
- C语言中编译器会给字符串常量分配地址,如果 "China", 存储在内存中的 0x3000、0x3001、0x3002、0x3003、0x3004、0x3005 ,因此,当写“China”的时候,实际上代表的是 "China"这个字符串的首地址0x3000
- 你把China 看作是字符串,但是编译器把它看作是地址 0x3000,即字符串常量的本质表现是代表它的第一个字符的地址
(2) char *s;
是定义的一个指针变量(它的地址在运行的时候才能确定),它指向一个字符型数据,它是可以被赋值的,同时也可以进行自增自减运算寻找连续的下一个地址。指针变量和普通变量是一个道理的,不同的只是指针变量存放的是地址,而普通变量存放的是数值或字符等。
(3)char *s = "China";
- 等价于 char *s ;s = "China";
- s是一个地址,同时"China"代表首地址,所以此句又等价于s = 0x3000,因为s是一个指针s="China"是把该字符串的首地址赋值给了s而不是把string的每个地址都给了s,前面已经指出字符串"China" 是存放在连续的存储单元的,所以可以通过s的递增来实现对每个元素的访问。
- *s="string";是错误的,因为*s和其他变量一样只能存放一个一个字符,而"string"中包含7个字符分别为s,t,r,i,n,g,\0
- printf("%s ", s); 传给它的其实是s所保存的字符串的地址。但是打印的时候,是从第一个地址一直向下找,一直到'\0'为止
char *s="China"; printf("%s\n",s);
打印结果为China
-
C语言中操作字符串是通过它在内存中的存储单元的首地址进行的,这是字符串的终极本质。
(4)char s[10];
定义了一个含有十个元素的数组,而且这十个元素在内存中是以连续的存储单元存放的。其中s是该数组的数组名字,而且s还是该数组的首地址(它的地址在编译的时候就已经确定了),也就是十个元素中的第一个元素的地址。务必注意s是一个指针常量,它是不能被赋值的也不能进行自增自减的!
(5)char s[10];s="string";
- 这样是错误的,因为s只是一个地址,是一个指针常量不是变量,所以是不能被赋值的。假设你在函数中声明一个char s[10];操作系统为其分配一个连续的10个存储单元,假设其首地址是1024,那么s的不仅代表着数组的名字而且它的值是1024,是一个常量不能被改变。
(6)char s[10]这种怎么初始化呢?
- char s[10]='0';这样是错误的,因为s有10个元素,但是仅仅给了其中一个元素赋值,所以是错误的。
- char s[10]={'0'};这样是正确的,相当于存入的是0、‘\0’
- char s[10]={'0','0'};这样是正确的,相当于存入的是0、0、‘\0’
- char s[10]={'C','h','i','n','a'};这样是正确的,相当于存入的是'C'、'h'、'i'、'n'、'a'、‘\0’
- char s[10]="0";这样是正确的,相当于存入的是0、‘\0’
- char s[10]="China";这样是正确的,相当于存入的是'C'、'h'、'i'、'n'、'a'、‘\0’
(7)char s[10]="string"等价于char *s;s="string";
4、
答案:F
解析:
putchar()函数
(1)作用:向终端输出一个字符。
(2)格式为putchar(c)
(3)c的三种形式
- 其中c可以是被单引号(英文状态下)引起来的一个字符
- 可以是介于0~127之间的一个十进制整型数(包含0和127)
- 也可以是事先用char定义好的一个字符型变量
(4)c被赋的值会被截断成char型数据了,putchar()这个函数不会检查要输出的字符的真正范围,所以输入的时候c一定是字符范围的一个数据
5、
答案:T
6、
答案:T
解析:
(1)题意:String是一个以' \0 '结尾的字符数组。
(2)string类型的数据在结尾处还是有' \0 '的。
二、单选题
1、
答案:A
2、
答案:C
解析:
程序开始,从main函数内开始执行,首先执行的函数是str=fun(str),str="abcdefgh"
传递到char* t,char *p=t;这样指向char的指针p包含的是t的首地址 str[0],
p+strlen(t)/2; t的长度是8 除以2等于4,所以 p+strlen(t)/2 就是str[4] 即e字符那个位置
所以返回的就是e字符及以后的字符,也就是efgh
三、编程题
最长对称子串 (25 分)
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
答案1(C语言 在pta中C语言可以用gets()的方法来输入含有空格的字符串):
#include <stdio.h>
#include <string.h>
int main()
{
char a[1001];
gets(a);
int sum=0;
int i;
for(i=0;i<strlen(a);i++)
{
int sum1=1;
int p=i-1;
int q=i+1;
while(p>=0&&q<=strlen(a)&&a[p]==a[q])
{
sum1+=2;
p-=1;
q+=1;
}
if(sum1>sum) sum=sum1;
}
for(i=0;i<strlen(a);i++)
{
int sum1=0;
int p=i-1;
int q=i;
while(p>=0&&q<=strlen(a)&&a[p]==a[q])
{
sum1+=2;
p-=1;
q+=1;
}
if(sum1>sum) sum=sum1;
}
printf("%d",sum);
return 0;
}
答案2(c++ 在pta中c++中是不能用gets()方法来实现输入含空格的字符串的,所以用了别的方法)
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a[1001];
scanf("%[^\n]",a);
int sum=0;
for(int i=0;i<strlen(a);i++)
{
int sum1=1;
int p=i-1;
int q=i+1;
while(p>=0&&q<=strlen(a)&&a[p]==a[q])
{
sum1+=2;
p-=1;
q+=1;
}
if(sum1>sum) sum=sum1;
}
for(int i=0;i<strlen(a);i++)
{
int sum1=0;
int p=i-1;
int q=i;
while(p>=0&&q<=strlen(a)&&a[p]==a[q])
{
sum1+=2;
p-=1;
q+=1;
}
if(sum1>sum) sum=sum1;
}
printf("%d",sum);
return 0;
}
注意:(1)输入含有空格的字符串的方法:
1、gets(a);
2、scanf("%[^\n]",a);
注意:scanf("%[^\n]%*c",a);这样写的话,*c可以忽略掉回车符
这样就可以输入3组数据
这样只能输入1组数据,因为后面的都被换行挡住了。
(2)注意memset的用法,最后一个sizeof括号中是a,而不是0;
思路:
(1)因为是求最长对称的长度,所以先输入,然后可以得到其长度
(2)分奇偶(这里并非是因为字符串为奇数还是偶数而分的奇偶,而是说,可能最长对称长度是一个奇数长度,也可能是一个偶数长度)
(3)如果是奇数的话,首先已经总对称长度已经是1了,之后i从0开始循环,p、q以i为中心,寻找对称的长度。
(4)如果是偶数的话,首先0,因为偶数中间没有多余的数据,之后i从0开始循环,p为i,q为i+1,寻找对称的长度。
(5)在是偶数之前,已经记录了如果是奇数的话,最长对称长度了,之后,sum在奇数最长长度的基础上与偶数长度一次次进行比较。