第四章作业-串(strcmp函数、字符串常量、char *str、char str[]、putchar()函数) 输入带有空格的字符串

一、判断题

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在奇数最长长度的基础上与偶数长度一次次进行比较。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值