请帮我做这几道C语言选择题?

10.3 语句printf("%d\n",strlen("ATS\n012\1\\"));的输出结果是:
A 11 B 10 C 9 D 8
答案:C 9
不是8个吗?'A''T''S''\n''0''1''2''1'.不包括“\0”

10.5 有以下程序:
#include<stdio.h>
#include<string.h>
void fun(char *w,int m)
{ char s,*p1,*p2;
p1=w;p2=w+m-1;
while(p1<p2)
{ s=*p1++;*p1=*p2--;*p2=s;}
}
main()
{ char a[]="ABCDEFG";
fun(a,strlen(a)); puts(a);
}
程序的输出结果是:
A GFEDCBA B AGADAGA C AGAAGAG D GAGGAGA
答案:C
怎么不是A呢?

10.6 有以下程序:
#include<stdio.h>
main()
{ char s[]="ABCD",*p;
for(p=s;p<s+4;p++) printf("%s\n",p);
}
程序运行后的输出结果是:
A ABCD B A C D D ABCD
BCD B C ABC
CD C B AB
D D A A
答案:A
不是for(p=s=s[0];p<=s[3];p++),输出p=A B C D吗?

10.14 有以下程序,若运行时从键盘输入字符串qwerty<回车>和abcd<回车>,则程序的输出结果是:
#include<string.h>
#include<stdio.h>
strle(char a[],char b[])
{ int num=0,n=0;
while(*(a+num)!='0') num++;
while(b[n]) { *(a+num)=b[n];num++;n++;}
return(num);
}
main()
{ char str1[81],str2[81],*p1=str1,*p2=str2;
gets(p1);gets(p2); printf("%d\n",strle(p1,p2));
}
答案:10 根本无从下手,num是系统的求字母数的函数吗?

10.15 以下程序运行后的输出结果是:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void fun(char str[])
{ int i,j;
for(i=0,j=0;str[i];i++) if(isalpha(str[i]))str[j++]=str[i];
str[j]='\0';
}
main()
{ char ss[80]="It is!";
fun(ss); printf("%s\n",ss);
}
答案:Itis 题中“if(isalpha(str[i]))”什么意思啊?怎么做?

是9个,'A' 'T' 'S' '\n' '0' '1' '2' '1' '\'

主要是理解s=*p1++;*p1=*p2--;*,s=*p1++;相当于s先赋值为*p1,然后p1执行加1操作,*p1=*p2--;*相当于*p1先赋值为*p2,然后p2执行减1操作

循环体共执行4次,第一次指针p指向s,所以输出ABCD,第二次指针p指向'B'的地址,所以输出BCD,第三次指向'C’的地址,输出CD,第四次指向'D’,输出D

num不是函数strle中定义的局部变量吗?while(*(a+num)!='0') num++;执行后,num是a的字符串长度,也就是6,while(b[n]) { *(a+num)=b[n];num++;n++;}中每次循环num执行加1,共4次循环,所以一共加4,最终结果是10.

isalpha是函数,用来判断传入的参数是否是英文字母,for(i=0,j=0;str[i];i++) if(isalpha(str[i]))str[j++]=str[i];是str字符串中的每个字符判断如果其是英文字母的话就保存,如果不是的话不保存,继续下一个循环判断下一个字符,所以最终的结果是把传入字符串中的非英文字母去掉,只保留英文字母。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-18
10.3,.应该是A T S \n 0 1 2 \1 \\,9个。,
10.5.第一次交换后,s=A,p1指向第二个字符,*p1--的值为G,付给第二个字符,然后p1指向倒数第二个字符,把s的值A付给了第二个字符。剩下的你自己算吧。
10.6,%s是字符串输出格式,所以会输出以某个字符打头的一串
10.14,num求将两个字符串连接后的长度,所以输出10.
10.15,if(isalpha(str[i]))”是判断是否是英文字符,包括大小写,fun函数就是要去掉字符串中的非英文字符。
第2个回答  推荐于2016-04-20
1、\\--->算一个字符“\”
2、注意,s=*p1++;*p1=*p2--;*p2=s,开始p1=A,p2=G,但是第一次执行这条后,S=A,P1=指向了B,然后P1被复制为P2指向的G,然后P2指向了F,然后P2有被S所指向的A赋值,此时W[0]和w[strlen(w)-1]都没被改变:此时成为:AGCDEAG
3、for(p=s;p<s+4;p++) printf("%s\n",p);
注意p是指针,指向的是地址,如果赋值的是字符串,那么代表字符串的首地址,首地址和结束符地址之间的为字符串。对应字符串的中*p代表第一字符串,*(p+1)代表第二个....
s:[ A B C D \0(虚的)] 代表字符串
开始 p | | | (ABCD)
p | | (BCD)
p | (CD)
p (D)
结束 p (\0)结束

4、while(*(a+num)!='0') num++;
这里错了,如果是这样的话,结果是随机的,应该为:
while(*(a+num)!='\0') num++;
注意'0'和'\0'的区别,看书就知道了

5、isalpha判断是否是字符,如果是字符就赋值,不是就不赋值,在这里空格直接被忽视掉了:-(
-----------------------------------------------------------------------------------------------
希望对应有用:
介绍个网站:http://faq.cprogramming.com本回答被提问者采纳
第3个回答  2011-03-19
到k-1的,所谓的n[k]只是在定义时候申请了k个元素的意思,数组中并不存在n[k]这个元素,所以系统就随机分配一个值。
第二题,用于p++中的++运算是先执行完所有的运算才进行的,即先输出,然后才将p指向下一个元素。如果改成++p就是先指向下一个元素,再输出了。
第三题,很简单,在你输入的时候,在a和b 之后都按了回车键,getchar()将回车作为一个元素读入,所以实际得到的数组就是a,<CR>,b,<CR>,d,e这六个字符,而<CR>在输出时就是换行的作用,这也就是为什么在输出a和b后都换行的原因
第四题,本循环共执行两次。第一次,i=0,所以执行aa[i][i+1]=*p+1,也就是aa[0][1]=*p+1,由于p指向aa[0][0],所以*p也就a[0][0,a[0][1]=*p+1=aa[0][0]+1=2+1=3,在if-else执行完后输出*p,也就是aa[0](=2),然后在第二次循环中执行的是++p,即将p指向下一个元素,也就是aa[0][1],然后输出*p,也就是aa[0][1],注意aa[0][1],在第一次循环中已经算出来等于3,
第4个回答  2011-03-18
第一道题:"ATS\n012\1\\",ATS这个是3个字符,\n是转义字符,算1个字符,012,3个字符,\1又是一个转义字符,\\也是一个转义字符表示\本身。这样字符数 3+1+3+1+1=9

第二道题,你慢慢去算。。。不难就是有点麻烦

第三道题: for(p=s;p<s+4;p++) printf("%s\n",p),这循环每次输出从指针p开始的字符串,循环4次。
第一次p指向的是“ABCD”起始位置,也就是指向A,这样输出的就是ABCD,第二次指向了B,输出的就是BCD,后面依次类推。S[0]这个值是A,而S则是这个数组的首地址,指向的是A。
第四道题,其实就是对输入的两个字符串的字符个数求和。第一次输入6个,第二次4个加起来就是10
第五道题,isalpha()应该是一个判断str[i]是空格还是其他字符的函数,是空格返回0,fun()这个函数是一个去字符串空格的函数
相似回答