习  题  7
7.1 选择题。
(1)下列对字符串的定义中,错误的是:  A      
A) char  str[7] = "FORTRAN";
B) char  str[] = "FORTRAN";
C) char  *str = "FORTRAN";
D) char  str[] = {'F','O','R','T','R','A','N',0};
(2)以下程序段的输出结果是:____D_________
char  a[] =  "ABCDE" ;
char  *p = NULL;
for (p=a; p<a+5; p++) 
{
    printf("%s\n", p);
}
A)ABCDE        B)  A            C) E            D)ABCDE
                        B                D                BCDE
                        C                C                CDE
                        D                B                DE
                            E                A                E
(3)下列程序是对字符串的相关操作,正确的是____D____。
A)
#include <stdio.h>
main()
{
    static char  a[5];
    a = "abcde" ;
    printf("%s\n", a);
}
B)
#include <stdio.h>
main()
{
    static char  a[7]= "goodbye!";
        printf("%s\n", a) ;
}
C)
#include <stdio.h>
main()
{
    char  a[5] = "abcde";
        printf("%s\n", a) ;
}
D)
#include <stdio.h>
main()
{
    static  char a[]="abcde";
        printf("%s\n", a) ;
}
(4)阅读下列函数,函数功能为___A_____。
void  Exchange(int *p1, int *p2)
{
    int  p;
    p = *p1;
    *p1 = *p2;
    *p2 = p;
}
A)交换*p1和*p2的值            B)正确,但无法改变*p1和*p2的值
C)交换*p1和*p2的地址      D)可能造成系统故障
(5)设有语句:int array[3][4]; 则在下面几种引用下标为i和j的数组元素的方法中,不正确的
引用方式是:___D_____。
A)array[i][j]            B)*(*(array + i) + j)
C)*(array[i] + j)          D)*(array + i*4 + j)
7.2 阅读下列程序,写出运行结果。
(1)
#include <stdio.h>
main()
{
    static int x[]  =  {1,2,3};
    int      s, i, *p = NULL;
    s = 1;
    p = x;
    for (i=0; i<3; i++)
    {
            s* = *(p + i);
    }
    printf("%d\n",s);
}
答案:6
(2)
#include <stdio.h>
main()
{
    int  a[] = {1,2,3,4,5};
    int  *p = NULL;
    p = a;
    printf("%d, ",*p);
    printf("%d, ",*(++p));
    printf("%d, ",*++p);
    printf("%d, ",*(p--));
    printf("%d, ",*p++);
    printf("%d, ",*p);
    printf("%d, ",++(*p));
    printf("%d, ",*p);
}
答案:1, 2, 3, 3, 2, 3, 4, 4,
(3)
#include  <stdio.h>
char  b[] = "program";
char  *a = "PROGRAM";
main()
{
    int  i = 0;
    printf("%c%s\n",*a, b + 1);
    while (putchar (*(a + i)))
    {
            i++;
    }
    printf("i = %d\n",i);
    while ( -- i)
    {
        putchar (*(b + i));
    }
    printf("\n%s\n", &b[3]);
答案:
Program
PROGRAM i = 7
margor
gram
(4)
/* 源文件名为demo.c  */
main(int argc, char *argv[])
{
    int  i;
   
    for (i=0; i<argc; i++)
    { 
        printf("%s\n", argv[i]);
    }
}
假设该文件demo.c及其可执行程序位于E盘的TC目录下,则当命令行参数为 This is a program,则运行结果应为什么?
答案:
This
is
a
program
7.3 阅读程序,按要求,在空白处填写适当的表达式或语句,使程序完整,并符合题目要求。
(1)下面函数实现strlen函数的功能,即计算指针p所指向的字符串中的实际字符个数。
unsigned int  MyStrlen(char *p)
{
    int  len;
    len = 0;
    for (; *p !=  \0    ; p++)
    {
        len ++    ;
    }
    return len    ;
}
(2)下面函数也是实现strlen函数功能的,但计算字符串s中的实际字符个数的方法与上一道题有所不同。
unsigned int  MyStrlen(char s[])
{
    char  *p = s;
    while (*p !=    \0strcmp可以比较单个字符吗      )
    {
            p++;
    }
    return     p-s    ;
}
[提示:移动指针p使其指向字符串结束标志,此时指针p与字符串首地址之间的差值即为字符串中的实际字符个数。]
(3)下面函数实现strcmp函数的功能,即比较两个字符串的大小,将两个字符串中第一个出现的不相同字符的ASII码值之差作为比较的结果返回,返回值大于0表示第一个字符串大于第二个字符串,返回值小于0表示,表示第一个字符串小于第二个字符串,当两个字符串完全一样时,返回值为0。
int  MyStrcmp(char *p1, char *p2)
{
    for (; *p1 == *p2; p1++,p2++)
    {
        if (*p1 == '\0')  return   0     ;
    }
    return     *p1-*p2    ;
}
7.4 在下面使用指针数组的程序中,存在一个错误,试分析这个程序,并上机运行,观察运行结果,到这个错误,并分析错误的原因。
#include <stdio.h>
void  Print(char *arr[], int len); 
void main()
{
    char  *pArray[] = {"Fred","Barrey","Wilma","Betty"};
    int    num = sizeof(pArray) / sizeof(char); 
    printf("Total string numbers = %d\n", num);
    Print(pArray, num);
}
void  Print(char *arr[], int len)
{
    int  i;
   
    for (i=0; i<len; i++)
    {
        printf("%s\n", arr[i]);
    }
}
答案:int    num = sizeof(pArray) / sizeof(char); 
应改为:int    num = sizeof(pArray) / sizeof(char*);或:
int    num = sizeof(pArray) / sizeof(pArray[0]);
理由:pArray是一个存放了4个字符串指针的数组,其中每一个元素是一个指针,而非一个字符。
程序希望得到的运行结果如下:
Total string numbers = 4
Fred
Barrey
Wilma
Betty
7.5 编写一个交换变量值的函数,利用该函数交换数组a和数组b中的对应元素。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。