C ++:使用fgets()读取字符输入时出错

时间:2018-04-08 20:04:03

标签: c++ c++14 fgets gets

我已经尝试了一个使用fgets()的简单代码,因为不再使用gets(),也不知道从键盘读取字符输入更好。 我的代码:

#include<iostream>
#include<cstdio>

using namespace std;



int main()
{
char a;
fgets(a, 100, stdin);
cout<<a;
return 0;
}

我收到了这个错误:

cpp:13:20: error: invalid conversion from 'char' to 'char*' [-fpermissive]
 fgets(a, 100, stdin);
                    ^
In file included from /usr/include/c++/7.2.0/cstdio:42:0,
                 from /usr/include/c++/7.2.0/ext/string_conversions.h:43,
                 from /usr/include/c++/7.2.0/bits/basic_string.h:6159,
                 from /usr/include/c++/7.2.0/string:52,
                 from /usr/include/c++/7.2.0/bits/locale_classes.h:40,
                 from /usr/include/c++/7.2.0/bits/ios_base.h:41,
                 from /usr/include/c++/7.2.0/ios:42,
                 from /usr/include/c++/7.2.0/ostream:38,
                 from /usr/include/c++/7.2.0/iostream:39,
                 from jdoodle.cpp:1:
/usr/include/stdio.h:564:14: note:   initializing argument 1 of 'char* fgets(char*, int, FILE*)'
 extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
              ^~~~~

然后,我试过

#include<iostream>    
#include<cstdio>

using namespace std;



int main()
{
char *a;
fgets(a, 100, stdin);
cout<<a;
return 0;
}

但又发生了另一个错误。

如果有人展示除了使用fgets()或解决上述问题之外的更好方法,我们将不胜感激。

3 个答案:

答案 0 :(得分:2)

您使用char *fgets(char *str, int n, FILE *stream)错误。 它旨在从文件中读取多个字符,实际上最多为n-1个字符,最后一个字符为空终止符。

您可以使用int getc(FILE *stream)来读取单个字符,如:

int a;
if((a = getc(stdin)) != EOF) {
  // use a 
  char c = a; // convert to char explicitly
}

当你使用c ++时,更好的方法是使用cin stream:

char a;
// formatted read(skips whitespace)
cin >> a;

// non-formated read
a = cin.get();

并且不要忘记在每次阅读后检查操作是否成功:

if(cin) {
  // success -> stream is ok
} else {
  // handle read error
}

如果您想阅读多个字符:

#include <iostream>
#include <cstdio>

using namespace std;

int main() {
  char a[100]; // allocate static buffer
  fgets(a, 100, stdin); // read in the buffer
  cout << a;
  return 0;
}

c ++方式也是:

#include <iostream>
#include <string>

using namespace std;

int main() {
  string s; // string that automatically manages memory
  cin >> s; // reads non-whitespace sequence of characters
  cout << s;
  return 0;
}

另一种选择是读取一行字符,最多\n包括空格。

#include <iostream>
#include <string>

using namespace std;

int main () {
  string s;

  getline(cin, s);
  cout << s;

  return 0;
}

答案 1 :(得分:-2)

您需要取消引用 a

char a[100];
fgets(&a, 100, stdin);
cout << a << endl;
return 0;

fgets的定义在第一个参数中有指针。当你尝试使用时

char a;

为1个字符自动分配空间。

使用时

char *a;

您必须使用malloc

分配空间

答案 2 :(得分:-2)

变量a是未分配的char指针。要么宣布&#39; a&#39;作为固定长度数组:     char a [100]; 要么 将记忆分配给&#39; a&#39;使用malloc:

shape