Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我无法正确地从用户处获取输入_C_Visual Studio - Fatal编程技术网

C 我无法正确地从用户处获取输入

C 我无法正确地从用户处获取输入,c,visual-studio,C,Visual Studio,我曾经和scanf一起工作;但visual studio告诉我这不安全, 当我使用FGET时;它只输入前两个输入,忽略第三个输入 void main() { char c=' '; char s[20]; char sen[40]; fgets(&c, sizeof(c), stdin); fgets(s, sizeof(s), stdin); fgets(sen, sizeof(sen), stdin); system("pa

我曾经和scanf一起工作;但visual studio告诉我这不安全, 当我使用FGET时;它只输入前两个输入,忽略第三个输入

void main() {

    char c=' ';
    char s[20];
    char sen[40];
    fgets(&c, sizeof(c), stdin);
    fgets(s, sizeof(s), stdin);
    fgets(sen, sizeof(sen), stdin);

    system("pause");

}
在这里,它实现了前两个FGET,而第三个FGET完全被忽略 为什么?
在c语言中,从用户处获取输入有哪些好的做法?

fgets会将空终止符和回车符存储在缓冲区内。因此,您应该确保缓冲区足够大,可以存储数据+空终止符+回车符。如果使用单个字符(如c),则它应该是大小为3的数组。字符+0+\n 对数组进行零初始化也是一种很好的做法

#include <stdio.h>
int main() {

    char c[3] = {0};
    char s[20] = {0};
    char sen[40] = {0};
    fgets(c, sizeof(c), stdin);
    fgets(s, sizeof(s), stdin);
    fgets(sen, sizeof(sen), stdin);
    return 0;
}
并使用int main而不是void main

如果确实希望在FGET中使用单个字符输入,则可以通过读取直到从输入流中提取回车符来清除输入流

#include <stdio.h>
int main() {

    char c;
    char s[20] = {0};
    char sen[40] = {0};
    fgets(&c, sizeof(c), stdin);

    while(getchar() != '\n'); //read until carriage return

    fgets(s, sizeof(s), stdin);
    fgets(sen, sizeof(sen), stdin);
    return 0;
}


您可以使用scanf_而不是scanf,这是微软的建议。它与scanf不同,但也与之类似,因此请仔细阅读手册。现在,您如何知道它只输入前2!?症状是什么?你提供了什么意见?你怎么知道这些变量存储了什么?@AnttiHaapala我声明了一个char变量、char数组和另一个char数组,并让用户使用fgets输入它们,因此程序要求输入前两个变量,甚至停止显示我在第三个fgets之前放置的第三个printf\