c++ - (c++) 打印字符数组字符串的单词问题
问题描述
我正在使用字符串(数据类型)和字符数组制作一个 c++ 程序。现在,数据类型可以打印单词了。但是,我在使用 char 数组时遇到了一些问题。这是代码:
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char str[200];
string str1;
cout<<"Enter a string:\t";
getline(cin,str1);
cout<<str1 <<endl;
cout<<"enter second string:\t";
cin>>str;
cin.get(str,200);
cout<<str;
}
正如您在输出中看到的那样,数据类型字符串可以很好地打印单词。但是,char 数组缺少第一个单词。难道我做错了什么?还是 char 数组以不同的方式工作?请解释。谢谢。
解决方案
虽然您已经发现这cin >> str;
不是必需的,因为您只是再次写入str
with cin.getline (str, sizeof str)
,但您应该解决许多其他问题:
1.除非您的编译器是古老的,否则您应该#include <string>
,而不是C-header string.h
;
2.不要在代码中使用幻数。如果您需要一个常量,例如对于 中的最大字符数str
,#define
一个常量或使用全局enum
来做同样的事情,例如
#define MAXC 200 /* if you need a constant, #define one (or more) */
...
char str[MAXC]; /* don't use 'magic-number', use a constant */
这样,如果您str
将来更改字符数,您就不必挑选整个代码并更改每次出现的幻数,例如cin.get(str,200);
.
3.验证每个用户输入。否则,失败的输入可能会在输入流上设置错误位,并且从设置了错误位的流中读取的额外尝试可能会导致未定义的行为。你可以这样做:
if (!getline(cin,str1)) { /* VALIDATE every input */
cerr << "error: input failure - str1.\n";
return 1;
}
和
if (cin.get (str, sizeof str))
cout << str << endl;
(注意:cin.get (str, sizeof str)
在保护您的使用后没有进一步的尝试读取str
就足够了)
4.在你的最后一行输出之后总是输出一个换行,以确保你的程序是 POSIX 兼容的。否则在许多操作系统上,如果写入,您将弄乱用户提示,stdout
或者如果将输出重定向到文件,您将创建不符合 POSIX 的输出文件,例如
my cat has none01:22 wizard:~/dev/src-cpp/tmp/debug>
总而言之,您可以执行以下操作:
#include <iostream>
#include <string> /* depending on your compiler */
#define MAXC 200 /* if you need a constant, #define one (or more) */
using namespace std;
int main (void) {
char str[MAXC]; /* don't use 'magic-number', use a constant */
string str1;
cout << "enter a string: ";
if (!getline(cin,str1)) { /* VALIDATE every input */
cerr << "error: input failure - str1.\n";
return 1;
}
cout << str1 << endl;
cout << "enter second string: ";
// cin >> str; /* not needed */
if (cin.get (str, sizeof str))
cout << str << endl;
}
示例使用/输出
$ ./bin/cin.get_getline
enter a string: my dog has fleas
my dog has fleas
enter second string: my cat has none
my cat has none
推荐阅读
- r - 给定 R 中的其他标准,如何对特定列中的特定值求和?
- javascript - 无法在反应中使用道具设置状态
- javascript - Aframe 通过单击图标切换相机视图
- amazon-cognito - AWS AppSync - 致命错误:未设置凭证提供程序和终端节点
- flutter - 参数类型“项目”不能分配给参数类型“列表”
' - wordpress - 如何删除 Vimeo Embedded Player 上的下载按钮?
- html - 来自嵌套数组的 V-for
- plot - 绘图网络 - 节点太靠近
- pip - Pip extras 依赖替换
- python - 使用 django-hosts 时使用的正确命名空间是什么