scanf(“%[^\n]“, str)正则用法
1 ^表示"非",[^\n]表示读入换行字符就结束读入。这个是scanf的正则用法,我们都知道scanf不能接收空格符,一接受到空格就结束读入,所以不能像gets()等函数一样接受一行字符串,但是使用%[^\n]就可以读取一行,直到碰到’\n’才结束读入。
使用%[^\n]后scanf可以读入空格类似于gets(),gets可以直接读入空格。
2 *表示该输入项读入后不赋予任何变量,即scanf("%*[^\n]%*c")表示跳过一行字符串。其中%c可以把’\n’吸收掉,防止影响后续输入。
使用*后scanf()既可以吧'\n'吸收防止影响后续操作。
字符转换
输⼊⼀个字符串,将字符串中⼤写字⺟全部转为⼩写字⺟,⼩写字⺟转成⼤写字⺟,其他字符保持不变。注:字符串的⻓度⼩于等于30,其中字符串中包含空格。
例如:输入:abcABC
输出:ABCabc
代码:
//法一:库函数的使用
//#include<stdio.h>
//#include<ctype.h>
//int main() {
// char buf[31] = { 0 };
// scanf("%[^\ns]", buf);
// //gets(buf);
// int i = 0;
// while (buf[i])
// {
// if (islower(buf[i])) {
// buf[i] = toupper(buf[i]);
// }
// else if (isupper(buf[i])) {
// buf[i] = tolower(buf[i]);
// }
// i++;
// }
// printf("%s\n", buf);
// return 0;
//}
//法二(不使⽤库函数)
#include<stdio.h>
int main() {
int i = 0;
char buf[31] = { 0 };
scanf("%[^\n]s", buf);
while (buf[i]) {
if (buf[i] >= 'a' && buf[i] <= 'z') {
buf[i] -= 32;
}
else if (buf[i] >= 'A' && buf[i] <= 'Z') {
buf[i] += 32;
}
i++;
}
printf("%s\n", buf);
}
运行结果: