我的目标是将分隔符更改scanf为" \n".我尝试使用scanf("%[^\n]s",sen);并且对单个输入工作正常.但是当我把同一行放在一个for多个句子的循环中时,它给了我垃圾值.
有谁知道为什么?
这是我的代码:
char sen[20];
for (i=0;i<2;i++)
{
scanf("%[^\n]s",sen);
printf("%s\n",sen);
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 12
考虑这个(C99)代码:
#include <stdio.h>
int main(void)
{
char buffer[256];
while (scanf("%255[^\n]", buffer) == 1)
printf("Found <<%s>>\n", buffer);
int c;
if ((c = getchar()) != EOF)
printf("Failed on character %d (%c)\n", c, c);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
当我运行它并输入一个字符串'绝对任何空格TABTAB标签丰富!'时,它给了我:
Found <<absolutely anything with spaces tabs galore!>>
Failed on character 10 (
)
Run Code Online (Sandbox Code Playgroud)
当然,ASCII(UTF-8)10 10是换行符.
这有助于您了解您的问题吗?
它适用于这种情况(对于单行)但如果我想将多行输入放入数组数组中则会失败.我不知道如何
scanf在代码中返回一个值?
有许多(大多数?)有经验的C程序员避免scanf()和fscanf()喜欢瘟疫的原因; 他们太难以正常工作了.我建议这个选择,使用sscanf(),不得到同样的咒骂那scanf()和fscanf()做.
#include <stdio.h>
int main(void)
{
char line[256];
char sen[256];
while (fgets(line, sizeof(line), stdin) != 0)
{
if (sscanf(line, "%255[^\n]", sen) != 1)
break;
printf("Found <<%s>>\n", sen);
}
int c;
if ((c = getchar()) != EOF)
printf("Failed on character %d (%c)\n", c, c);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
这将读取输入行(使用fgets()它确保没有缓冲区溢出(假装该gets()函数,如果您听说过它,将您的计算机熔化为金属和硅池),然后用于sscanf()处理该行.这将处理新行,这是原始代码的垮台.
char sen[20];
for (i=0;i<2;i++)
{
scanf("%[^\n]s",sen);
printf("%s\n",sen);
}
Run Code Online (Sandbox Code Playgroud)
问题:
scanf()成功.scanf()的定义scanf()是:(从1999年的ISO/IEC 9899):
§7.19.6.4scanf函数
概要
Run Code Online (Sandbox Code Playgroud)#include <stdio.h> int scanf(const char * restrict format, ...);描述
2该
scanf函数等同于fscanf参数stdin之前插入的参数scanf.返回
3
scanf如果在任何转换之前发生输入故障,该函数将返回宏EOF的值.否则,该scanf函数返回分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零.
请注意,当我的第一个程序中的循环退出时,它是因为scanf()返回0而不是EOF.