#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
const int lung = 41;
void main() {
char ceva1[lung];
scanf_s("%[a-zA-Z ]s", ceva1, sizeof(ceva1));
printf("%s", ceva1);
scanf_s("%[a-zA-Z ]s", ceva1, sizeof(ceva1));
printf("%s", ceva1);
_getch();
}
只有第一个printf_s工作,它只是printf文本的两倍。我发现工作的单一方式是使用getline在c ++中,但我想在c中使用scanf优先。
答案 0 :(得分:3)
对scanf_s("%[a-zA-Z ]s",
的调用都不会使用 Enter 键入'\n'
。 '\n'
仍然是下一个要阅读的字符@Serge Ballesta。所以第二个电话什么也没读。如果代码检查了scanf_s()
的返回值,则可能已推断出此值。
而不是scanf*
和*getc*
,请使用fgets()
@user3121023读取一行,如果需要,请删除潜在的'\n'
。
if (fgets(ceva1, sizeof ceva1, stdin)) {
ceva1[strcspn(ceva1,"\n")] = '\0';
// use ceva1
}
避免在任何地方使用scanf*()
,即使是为了阅读数字。
char buf[80];
if (fgets(buf, sizeof buf, stdin)) {
int a,b;
if (sscanf(buf, "%d%d", &a, &b) == 2) {
// use a, b
}
}
答案 1 :(得分:0)
这个表达式:
"%[a-zA-Z ]s"
应该是:
"%[a-zA-Z ]"
请注意没有尾随's'。
但是,这将停止任何非字母字符的输入(如空格,标点符号或换行符或数字。)
如果想要在一行上输入所有内容,请使用格式字符串,如:
"%[^\n]"
如果您发布一些示例输入,我们可以在我们的帮助下更加具体。