第三章 数组和字符串

3-1 Tex中的引号 uva272  (接收待空格的字符串)

问题:

1、如何判断左双引号和右双引号。  

         因为左右双引号是成对出现的,所以可以用一个标志变量q=1,左双引号,遇到q=1进行左双引号的相关操作,同时q = !q;此时q=0表示该遇到右双引号。

2、如何接收输入字符串。  (c = getchar()) != EOF

注意:

1、scanf("%s") 碰到空格或者TAB会停下来,无法记录空格。那如何存储一句话呢?有两种方法

①用fgetc(fin),读取一个打开的文件fin,读取一个字符,然后返回一个int值。

用 fgetc(stdin),从标准输入读取一个字符,getchar()与之等价。

②使用fgets(buf,maxn,fin)  从文件中读取完整的一行放在字符数组buf中。

fgets(buf,maxn,stdin) 从标准输入中读取一行放入数组buf中。(6-1用到了)

 #include
 using namespace std;

 int main(){
 	int c,q = 1; //c应该定义为int类型,因为getchar返回ASCII码或-1(EOF)
 	while((c = getchar()) != EOF){
 		if(c == '"') {printf("%s",q? "``": "''"); q =! q;
		}else{
			printf("%c",c);
		}
	 }
	return 0; 
 } 

 

3-2 WERTYU uva10082 (常量数组)

问题:

1、如何进行输入输出的转换?(输出的字符为输入的字符在键盘上该字符左边的字符)

         如果用if或者switch语句则会比较麻烦。可以定义一个常量数组记录键盘上各字符的位置。然后遍历寻找每个输入字符的位置。

char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";    \\注意“\"需要转义。

【相关知识】

字符串 字符数组

字符串实际上是以'0'结尾的一位字符数组。如利用char s1[] = "hello";初始化后,字符数组s1的大小为6,且s[5]=’\0'。

当然定义数组时也可以char s2[] = {'h','e','l','l','o'};  此时s2大小为5.

区别sizeof()和strlen()

sizeof是C/C++中的一个运算符,可以用类型做参数。其作用是返回一个对象或者类型在内存中所占用的字节数。(编译时候计算)

strlen是C/C++中的库函数,头文件为string.h/cstring。 只能用char*作为参数(最后一个元素值为’\0'的字符数组,字符),求的是字符串的实际长度,即从开始到遇到‘\0'结束。(运行时候计算)

例如:

char str[20] = "1234567890";
int a = strlen(str); //a = 10
int b = sizeof(str); //b = 20

char s[] = "hello";
int m = strlen(s);// m = 5 字符串的实际长度
int n = sizeof(s); //n = 6  字符数组的长度
 #include
 using namespace std;
char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";

int main(){
	int i,c;
	while((c = getchar()) != EOF){ 
		//循环停止的条件是s[i] == c && s[i] 
		for(i = 1; s[i] && s[i] != c; i++);//从s[1]开始找错位之后的字符在常量表中的位置
		if(s[i]) putchar(s[i - 1]); 
		else putchar(c); //空格 回车
	}
	return 0; 
}

 

 

 

 

 

 

你可能感兴趣的:(算法竞赛入门)