PA0:关于练习10-15

练习11:

 

附加题:复制操作:

    i=0;
     while(i<argc)
     {
         states[i]=argv[i];
         i++;
     } 
     

如果还要考虑安全性,那就在循环体里面增加判断:

  i=0;
  j=0;
  while(i<argc)
 {
       states[i]=argv[i];
       i++;
       j++;
       if(j>=3)  break;   //达到states上限后强行中止循环
 } 
     

2)首先, char a[]=xxx,char b[]=xxx。这种情况下,b不能等于a,这是非法语句,不可以将别的值赋给数组名,这是常量。

如果用char*a =“yes”,char *b=“no”,然后b=a,这是可以的。但是这并也不是复制,因为a和b都是指针,我们只是把a指针的值给了b,换句话说,两个指针现在都指向了内存a,但是原来的两个字符串都还好好地躺在内存里。如果要真的实现字符串复制的效果,要用strcpy。

 

 

----------------练习13--------

 

#include <stdio.h>

int main(int argc,char *argv[])
{
    if(argc!=2)
    {
        printf("wrong argument\n");
        return 1;
    }
    
    int i=0;
    for(i=0;argv[1][i]!='\0';i++)
    {
        char letter=argv[1][i];
        switch(letter) {
            case 'A':
                printf("%d: %c\n", i,letter-32);
                break;

            case 'E':
                printf("%d: %c\n", i,letter-32);
                break;

            case 'I':
                printf("%d: %c\n", i,letter-32);
                break;

            case 'O':
                printf("%d: %c\n", i,letter-32);
                break;

            case 'U':
                printf("%d: %c\n", i,letter-32);
                break;

            case 'Y':
                if(i > 2) {
                     printf("%d: %c\n", i,letter-32);
                }
                break;

            default:
                printf("%d: %c is not a vowel\n", i, letter);
        }
    }
    return 0;
}

//大写转小写

如果不限制要转换的字母是哪个,那可以直接用if(letter>='A' && letter <='Z')  printf("%c \n",letter-32);

在Y的例子里,break写在if条件外。因为if是条件判断,不一定要进入。如果break写在if里面,有时候就无法走到break,会一直向下走入default,把default的代码也执行一遍。

 

-----------------练习14---------

附加题:修改后的程序:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

// forward declarations
void print_letters(char arg[]);

void print_arguments(int argc, char *argv[])
{
    int i = 0;
    int len;
    for(i = 0; i < argc; i++) 
    {
        len=strlen(argv[i]);
        print_letters(argv[i],len);
    }
}

void print_letters(char arg[],int len)
{
    int i = 0;

    for(i = 0; i<len; i++) 
    {
        char ch = arg[i];

        if( isalpha(ch) || isblank(ch) ) 
        {
            printf("'%c' == %d ", ch, ch);
        }
    }

    printf("\n");
}

 

----------------练习15-------

对于字符串,sizeof()在处理长度时会计入\0作为一个字符,它统计的是占用空间的大小;而strlen()只计算字符串长度,不考虑\0结束符。

对于一个char指针  :char *a;  它可以指向单个字符,也可以是指向一个字符数组或者字符串,C语言中没有直接区别指向单个字符还是数组的功能。

  注意,字符串在C语言中是字符串常量的存储形式。存储在常量区,不可以修改。即char *a="yes"  ,不可以用a[i]的方式修改内容。 而字符数组存储在栈区,可以修改内容。

 

-----------------------------------------

 

posted @ 2024-01-17 14:59  namezhyp  阅读(7)  评论(0编辑  收藏  举报