指针,结构体(错题题目集)

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);
}

如果你有什么疑问,请在评论区下留言,多多支持哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值