C 扫描直到换行
我想阅读输入的所有文本,直到输入新行字符 这是我的密码C 扫描直到换行,c,scanf,C,Scanf,我想阅读输入的所有文本,直到输入新行字符 这是我的密码 int i=0; char ch[MAX]; printf("Enter the text\n"); while(true) { scanf("%c",&ch[i]); if(ch[i]=='\n') break; i++; } 但当我尝试执行时,它只读取一个单词 我也尝试过scanf(“%s”,ch)但结果是相同的。在依赖ch[i]获得有效值之前,您没有检查scanf()是否成功,
int i=0;
char ch[MAX];
printf("Enter the text\n");
while(true)
{
scanf("%c",&ch[i]);
if(ch[i]=='\n')
break;
i++;
}
但当我尝试执行时,它只读取一个单词
我也尝试过scanf(“%s”,ch)代码>但结果是相同的。在依赖
ch[i]
获得有效值之前,您没有检查scanf()
是否成功,这不是一个好主意
只需一次阅读一整行即可。将注释转移至答案 你的代码会工作的。您发布的代码将扫描所有内容,直到找到换行符(
\n
)。但正如所评论的,您永远不会NUL终止您的字符串。要做到这一点,请使用
ch[i]='\0';
在循环之后。此外,用户输入的字符数可能超过MAX-1
(结尾处的\0
多出一个字符),这可能会导致错误。您应该添加一个类似于
if(i==MAX-1)
break;
就在您的scanf
之前,以防止其溢出
注意scanf(“%s”,ch)
将一直扫描,直到遇到空格或换行符。
不要一个字符一个字符地循环和扫描,只需使用
scanf("%[^\n]",ch);
getchar();
上面的scanf
扫描所有内容,直到找到换行符并将它们放入ch
。然后,getchar()
从stdin
中丢弃\n
。您还可以通过限制scanf
读入ch
的字符数量来提高安全性
scanf("%49[^\n]",ch);
上述
scanf
将最多扫描49个字符,并将在末尾添加一个\0
。您可以在此处替换MAX-1
的值。我以50为例。您的代码运行良好。我检查过了,它读的是一行而不是一个字。我希望在代码方面对您更有利:
int main()
{
int i=0;
char ch[100];
printf("Enter the text\n");
gets(ch); // input text
puts(ch); // output text
return 0;
}
输入:asdf ghjkl zxcvb
输出:
asdf ghjkl zxcvb
正如@Jonathan Leffler所评论的那样,OP的代码不会为null终止字符串或防止缓冲区溢出
由于代码一次获取1个char
,因此使用更简单的fgetc()
@almasshaikh否,
get()
不应被推荐。这很危险。好的@放松谢谢你纠正我。“它只读一个字”-不。你的代码完全符合你的需要。或者另一种方法是使用scanf(“%[^\n]”,ch);getchar()代码>字符串未以null结尾。您也不会检查scanf()
是否返回了字符;您应该始终检查它是否返回了您期望的结果。您还应该检查输入不超过ch
的长度,这样就不会出现缓冲区溢出(在本例中,这当然是一个)。谢谢您,我刚才在谷歌上搜索了fgets()char*fgets(char*str,int n,FILE*stream)参数*stream应该是什么,以便从中读取keyboard@AdityaKiran,就你而言,您可以使用fgets(ch、MAX、stdin)代码>否!绝对不要,不要,不要,不要建议使用get()
。这是非常可怕的。它不再是标准C,可以说(很容易说)也不应该是标准C——尽管如此,有理由将其包含在C89中。看@JonathanLeffler从不说不。如果有人想要优雅的代码故意缓冲区溢出,scanf和get是很好的选择:)您没有以null结尾字符串;你没有检查缓冲区的长度。@JonathanLeffler,是的,你说得对。我已经编辑了答案。我现在有点担心你对格式字符串中的宏MAX的评论。如果您有#定义最大值39
(为了参数),宏#定义字符串(x)求值(x)
和#定义求值(x)#x
,并且您定义字符ch[MAX+1]
,则可以使用scanf(“%”STRINGIZE(MAX)[^\n]”,ch)
,但MAX必须扩展为一个简单的数字,而不是通用表达式。否则,我看不出它是如何工作的。@JonathanLeffler,我只是尝试了我在回答中描述的内容,GCC抛出了一个警告:/(格式中的未知转换类型字符“M”并指向扫描
)。我认为在编译程序之前,预处理器将程序中的所有MAX
替换为50(如果我们有#define MAX 50
)。我尝试了你所说的,它成功了…@JonathanLeffler,预处理器在编译阶段之前没有完成它的工作吗?代码不为null终止字符串或确保没有缓冲区溢出。
int i=0;
char ch[MAX];
int single; // Important that this in an int to distinguish EOF from input.
printf("Enter the text\n");
while((single = fgetc(stdin)) != EOF) {
if (i >= (MAX-1)) {
; // Too many, do not save or maybe indicate error
} else {
ch[i++] = single;
}
if (single == '\n') {
break;
}
}
ch[i] = '\0'; // Add termination