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]的方式修改内容。 而字符数组存储在栈区,可以修改内容。
-----------------------------------------