总结
gets(str);
gets遇到回车符时结束,也可以读入多行字符串(包含空格),比较方便,但是不安全。
不会存入回车符,缓冲区中也不会遗留换行符。后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了
fgets(str,10000,stdin);
fgets函数可以直接读取含空格的字符串。遇到回车或EOF时结束,可以存入回车,也可以循环读入多行字符串。并且fgets函数可以指定读取的最大字符数,避免缓冲区溢出的风险。
中间参数为字符串的最大长度,最后stdin表示从标准输入读取字符串。
gets与fgets的区别
1安全
2最后回车符是否写入字符串中
scanf("%[^\n]%*c", str);
scanf("%*c%[^\n]", str);
scanf(" %[^\n]", str);
scanf("\n%[^\n]", str);
这里使用了%[^\n]格式控制符来读取含空格的字符串,它表示读取到换行符\n之前的所有字符,包括空格和制表符。即读入一行字符串
%*c 表示读入一个字符但不赋值给任何变量(即读入换行符并将其丢弃)只有1行字符串可以不要
多行字符串必须有
可以用 空格 或者 \n 代替%*c
只读入1行可以没有 %*c 或者 空格 或者 \n 多行必须吃掉回车符 故不能存入回车符
scanf("%s",str);
使用scanf函数和使用%s格式化字符串,这样scanf会读取一段不包含空白字符(空格、制表符、换行符等)的字符串,只读取空格之前的数据,遇到空格或换行符就停止读取。
for(int i=0;scanf("%c",&str[i++])!=EOF;);
回车符也会存入 只有1行字符串可用 但不能直接多行分开存 ,他会直接读取所有输入的包括回车
所以输入字符串只有1行可用,多行直接分别存储不行
在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”
因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束
例题
输入首先在第一行给出一个正整数 n(≤100),是土味情话的条数。随后 n 行,每行(以回车结束)给出一句土味情话。用汉语拼音给出的土味情话由不超过 100 个数字、中文字的汉语拼音、标点符号组成,相邻两字间以标点符号或/和 1 个空格分隔,每个字的拼音长度不超过 5 个小写英文字母,数字为不超过 100 的非负整数。题目保证每句土味情话都不是空话(至少有一个字的拼音或数字)。
输出格式:
按照输入的顺序,原样输出那些句子中带数字的土味情话。如果完全没有带数字的句子,则输出 Not interesting.。
输入样例 1:
5
wo fa xian ni jin tian you dian guai, wei shen me? guai ke ai de.
wo shi 9 ni shi 3, chu le ni hai shi ni.
ke yi bang wo xi ge dong xi ma? xi shen me? xi huan wo.
wo 1 dian ye bu xiang ni, 1 dian ban zai xiang.
1 dui 0 shuo, wo chu le ni, yi qie du mei you yi yi.
输出样例 1:
wo shi 9 ni shi 3, chu le ni hai shi ni.
wo 1 dian ye bu xiang ni, 1 dian ban zai xiang.
1 dui 0 shuo, wo chu le ni, yi qie du mei you yi yi.
输入样例 2:
2
wo fa xian ni jin tian you dian guai, wei shen me? guai ke ai de.
ke yi bang wo xi ge dong xi ma? xi shen me? xi huan wo.
输出样例 2:
Not interesting.
代码 gets fgets scanf
#include <stdio.h>
int main()
{
char str[10000];
int i=0,n=0,flag,flag1 =0;
scanf("%d\n",&n);
while (n--)
{
flag1=0;
// gets(str); //gets不会存入回车符
//fgets(str,10000,stdin); //fgets会存入回车符 stdin表示从标准输入读取字符串。
scanf("%*c%[^\n]", str);
//其中 %[^\n] 表示读入非换行符的所有字符(即读入一行字符串)
//%*c 表示读入一个字符但不赋值给任何变量(即读入换行符并将其丢弃)PAT可以用空格或者\n在后面 codeblocks不行 但可以在前面
//只读入1行可以没有空格或者\n 多行必须吃掉回车符 故不能存入回车符
for (i=0;str[i]!='\0';i++);//不能有int 否则离开这个循环后i为进入循环之前的值 PTA会把没有赋值的变量自动设置为0
for (int j=0;j<i;j++)
{
if (str[j]<='9' && str[j]>='0')
{
flag = 1;flag1=1;
for (int k=0;k<i;k++) //在PAT里面不能有等于 即不能打印\0 否则后面的无法打印
printf("%c",str[k]);
break;
}
}
if(flag1)printf("\n");
}
if (!flag)printf("Not interesting.");
}
代码 EOF
#include <stdio.h>
/*scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2;如果只有a被成功读入,返回值为1;
如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF,且返回值为int型。
要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,
因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.
*/
int main()
{
char str[10000];
int n,flag =0,lineEnd=-1; //初值为-1不需要分情况
scanf("%d\n",&n); //没有吃掉回车符会少循环一次 相当于第一次循环只读了这一个回车符
for(int i=0;scanf("%c",&str[i++])!=EOF;); //回车符也会存入 只有1行字符串可用 但不能直接多行分开存 codeblocks不行 但PAT可以
while(n--)
{
int lineBegin = lineEnd+1; //每次行的开头为上一个行的末尾加1
for ( lineEnd=lineBegin; str[lineEnd]!='\n'; lineEnd++);//当读到回车符时结束
for (int i=lineBegin; i<lineEnd; i++)
{
if (str[i]<='9' && str[i]>='0')
{
flag = 1;
for (int k=lineBegin;k<=lineEnd;k++)//等于会打印回车
printf("%c",str[k]);
break;
}
}
}
if (!flag)
printf("Not interesting.");
}
6687

被折叠的 条评论
为什么被折叠?



