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<cstdio>
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<cstdio>
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;
}