练习13:Switch语句
- 编写另一个程序,在字母上做算术运算将它们转换为小写,并且在switch中移除所有额外的大写字母。
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc != 2) {
printf("ERROR: You need one argument.\n");
// this is how you abort a program
return 1;
}
int i = 0;
for(i = 0; argv[1][i] != '\0'; i++) {
char letter = argv[1][i];
switch(letter) {
case 'a' :
printf("%d: 'A'\n", i);
break;
case 'A':
argv[1][i]='\0';
break;
case 'e':
printf("%d: 'E'\n", i);
case 'E':
argv[1][i]='\0';
break;
case 'i':
printf("%d: 'I'\n", i);
case 'I':
argv[1][i]='\0';
break;
case 'o':
printf("%d: 'O'\n", i);
case 'O':
argv[1][i]='\0';
break;
case 'u':
printf("%d: 'U'\n", i);
case 'U':
argv[1][i]='\0';
break;
case 'y':
case 'Y':
if(i > 2) {
// it's only sometimes Y
printf("%d: 'Y'\n", i);
}
break;
default:
printf("%d: %c is not a vowel\n", i, letter);
}
}
return 0;
}
- 使用’,'(逗号)在for循环中初始化letter。
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc != 2) {
printf("ERROR: You need one argument.\n");
// this is how you abort a program
return 1;
}
int i = 0;
char letter = argv[1][0];
for(i = 0; argv[1][i] != '\0'; i++,letter = argv[1][i]){
switch(letter) {
case 'a' :
printf("%d: 'A'\n", i);
break;
case 'A':
argv[1][i]='\0';
break;
case 'e':
printf("%d: 'E'\n", i);
case 'E':
argv[1][i]='\0';
break;
case 'i':
printf("%d: 'I'\n", i);
case 'I':
argv[1][i]='\0';
break;
case 'o':
printf("%d: 'O'\n", i);
case 'O':
argv[1][i]='\0';
break;
case 'u':
printf("%d: 'U'\n", i);
case 'U':
argv[1][i]='\0';
break;
case 'y':
case 'Y':
if(i > 2) {
// it's only sometimes Y
printf("%d: 'Y'\n", i);
}
break;
default:
printf("%d: %c is not a vowel\n", i, letter);
}
}
return 0;
}
- VIM批量缩进
在程序代码界面,按esc,退出编辑模式,到命令模式,并在英语输入法下输入“:”
将所要批量缩进的行号写上,按照格式:“行号1,行号2>”输入命令,如要将2至9行批量缩进一个tab值,则命令为“2,9>”
输入完毕后,按回车可以执行,就可以看到2至9行全部缩进了一个tab值了,
- 使用另一个for循环来让它处理你传入的所有命令行参数。
这里把./ex13也会当作第一个参数
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc != 2) {
printf("ERROR: You need one argument.\n");
// this is how you abort a program
return 1;
}
int i = 0;
char letter = argv[1][0];
int j = 0;
for(j=0;j<argc;j++){
for(i = 0; argv[j][i] != '\0'; i++,letter = argv[j][i]){
switch(letter) {
case 'a' :
printf("%d: 'A'\n", i);
break;
case 'A':
argv[j][i]='\0';
break;
case 'e':
printf("%d: 'E'\n", i);
case 'E':
argv[j][i]='\0';
break;
case 'i':
printf("%d: 'I'\n", i);
case 'I':
argv[j][i]='\0';
break;
case 'o':
printf("%d: 'O'\n", i);
case 'O':
argv[j][i]='\0';
break;
case 'u':
printf("%d: 'U'\n", i);
case 'U':
argv[j][i]='\0';
break;
case 'y':
case 'Y':
if(i > 2) {
// it's only sometimes Y
printf("%d: 'Y'\n", i);
}
break;
default:
printf("%d: %c is not a vowel\n", i, letter);
}
}
}
return 0;
}
- 在“Y”的例子中,我在if代码块外面写了个break。这样会产生什么效果?如果把它移进if代码块,会发生什么?自己试着解答它,并证明你是正确的。
如果将break语句从if代码块外部移到if代码块内部,会导致不同的行为。
当前的代码如下:
case 'y':
case 'Y':
if (i > 2) {
// it's only sometimes Y
printf("%d: 'Y'\n", i);
}
break;
如果将break移动到if代码块内部,如下所示:
case 'y':
case 'Y':
if (i > 2) {
// it's only sometimes Y
printf("%d: 'Y'\n", i);
break;
}
这样做会导致在满足条件i > 2时打印出"'Y'"并终止switch语句。也就是说,当letter为小写字母'y'或大写字母'Y'且i大于2时,将打印"'Y'"并结束当前的case分支。
将break移到if代码块内部的效果是,当条件满足时,将终止switch语句的执行,而不会继续执行后续的case分支。如果将break放在if代码块外部,switch语句会继续执行后续的case分支,而不会在满足条件时中断。