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