1.
char s[ ] = "language", *p = s;
while( *p++ != 'u') {
printf("%c", *p – 'a' + 'A');
}
A.LANGUAGE
B.ANGU
C.LANGU
D.LANG
解释:p指向字符串首地址,while判断p指向的字符是否为'u',如果是'u'则循环结束,然后将字符转换为大写字符
这里的一个关键问题是,while中* p++ != ‘u',是先判断 * p != 'u',然后p++,因此判断字符l!='u'后,p接着就指向了下一个字符'a',因此printf输出的是'A',当p指向字符'g'时,也不等于'u',然后p指向下一个字符'u',因此会输出'U'
最终输出的字符是"ANGU"
2.
对于以下结构定义,++p->str
中的++
加在()。
struct {
int len;
char *str;
} *p;
A.指针str
上
B.指针p
上
C.str
指向的内容上
D.语法错误
解释:这里的->优先级高于++,所以++p->str 就相等于++(p->str),由于str是指向char类型的指针,所以++加在了指针strs 上。
3.对于以下结构定义,(*p)->str++
中的++
加在()。
struct {
int len;
char *str
} *p;
A.指针str
上
B.指针p
上
C.str
指向的内容上
D.语法错误
解释:指针类型在调用其成员的时候才用-> 而*p已经是正常的结构体类型了,所以用.才对
4.
struct stu{
int x;
int *y;
} *p;
int dt[4] = {10, 20, 30, 40};
struct stu a[4] = {50, &dt[0], 60, &dt[1], 70, &dt[2], 80, &dt[3]};
int main( )
{
p=a;
printf("%d,", ++p->x);
printf("%d,", (++p)->x);
printf("%d", ++(*p->y));
return 0;
}
A.10,20,20
B.50,60,21
C.51,60,21
D.60,70,31
解释:先看第一个输出,++p->x,因为->的优先级高于++,所以先++(p->x)是访问的数组a中的第0个元素中的x,所以++p->x的值为51.
第二个输出:(++p)->x,()优先级高,所以p指向的地址a下移一位,即a[1],访问结构体a[1]中的成员x,即60.
第三个输出:++(*p->y),*p->y,此时的p指向的是a[1],访问结构体a[1]中的成员y,即20,但是还要++,最后结果为21。
5.
写出下面程序段的运行结果 10,41,70
struct table {
int x, y;
}a[4]={{10, 20}, {30, 40}, {50, 60}, {70, 80}};
struct table *p = a;
printf("%d,", p++->x); /* 以下输出数据之间没有空格分隔 */
printf("%d,", ++p->y);
printf("%d", (a+3)->x);
解释:第一个输出:因为->的优先级高,所以应写为:p->x输出,10,然后p++指向数组a的下一个元素
第二个输出:同理,p->y是40,++后的值是41.
第三个输出:a+3即a[3].x,为70.
6.程序填空题
先消除输入字符串s的前后空格,再判断其是否为“回文”(即字符串正读和倒读都是一样的),若是则输出YES,否则输出NO。
#include<stdio.h>
#include<string.h>
int main(void)
{
char ch, s[80], *p, *q;
int i, j, n;
gets(s);
p =s;
while ( *p == ' '){
p++; //如果数组s的第一个字符是空格,则指针p向后移一位。
}
n = strlen(s);
q = s+n-1;
while ( *q == ' '){
q--; //指针q是指向的数组s的最后一个元素(不是‘\0’,因为n-1了),q--指向后面非空格的字符
}
while ( p<=q&& *p ==*q){
p++; //p与q分别从前往后,从后往前比较元素是否相等
q--;
}
if ( p<q ){
printf("NO\n");
}else{
printf("YES\n");
}
return 0;
}
7.函数insert()
的功能是在一维数组 a 中将 x 插入到下标为 i(i>=0) 的元素前,如果 i>= 元素个数,则x插入到末尾。元素个数存放在指针 n 所指向的变量中,插入后元素个数加1。
#include <stdio.h>
void insert(int a[ ], int *n, int x, int i)
{
int j;
if (i<*n){
for(j = *n-1;i<=j; j--){ //从后向前遍历数组,碰到要插入的下标后停止。
a[j+1]= a[j];
}
}else{
i = *n;
}
a[i]= x ;
(*n)++;
}
int main()
{
int a[100], x, i, n;
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
scanf("%d%d", &x, &i);
insert(a, &n, x, i);
for(i = 0; i < n; i++){
printf("%d " , a[i]);
}
printf("\n");
return 0;
}
8. 只要将多个指针作为函数的参数,函数就一定会返回多个值。F
解释:函数是否会返回多个值依据题目需要是否返回。
9.
#include <stdio.h>
int main()
{
char sa[ ] = "array";
char *s = NULL ;
scanf("%s",s);
printf("%s\n ", s);return 0;
一开始字符指针指向了空,如果要输入字符来对字符来对s进行赋值,是不能进行的。
10.
6-1 两个字符串穿插 (5 分)
本题要实现的程序功能是:
①从键盘上先后读入两个不超过32个字符的字符串,存储在字符数组str1和str2中。②将字符串str2插入字符串str1中,在屏幕上输出新生成的str1。
函数接口定义:
void conj(char *s1, char *s2);
裁判测试程序样例:
#include <stdio.h>
#include <string.h>#define N 32
void conj(char *s1, char *s2);
int main(void)
{
char str1[N * 2], str2[N];gets(str1);
gets(str2);conj(str1, str2);
printf("After conj string1:%s\n", str1);return 0;
}/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
123456789
abcdefghijklmn
输出样例:
在这里给出相应的输出。例如:
After conj string1:1a2b3c4d5e6f7g8h9ijklmn
代码如下:
void conj(char *s1, char *s2)
{
int i=0,j=0,k=0;
int l1=strlen(s1);
int l2=strlen(s2);
char s[100];
while((i<l1)&&(i<l2))
{
s[k++]=s1[i++];
s[k++]=s2[j++];
}
while(i<l1)
s[k++]=s1[i++];
while(j<l2)
s[k++]=s2[j++];
s[k]='\0';
strcpy(s1,s);
}
如果你有什么疑问,请在评论区下留言,多多支持哦