Visual Studio 2017中的c scanf_s不能多次使用

时间:2017-12-11 12:10:48

标签: c visual-studio-2017 scanf

#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优先。

2 个答案:

答案 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]"

如果您发布一些示例输入,我们可以在我们的帮助下更加具体。