C++ 程序仅打印C+;中数组的前三个字符+;
我的程序是将字符读入数组并显示到控制台。但我不知道为什么它只读前3个字符C++ 程序仅打印C+;中数组的前三个字符+;,c++,c++11,C++,C++11,我的程序是将字符读入数组并显示到控制台。但我不知道为什么它只读前3个字符 #include <iostream> using namespace std; int main() { int length=0,i; char str[10]; cout<<"Enter a string"<<"\n"; for(i=0; str[i] != '\0'; i++) { cin>>str[i];
#include <iostream>
using namespace std;
int main() {
int length=0,i;
char str[10];
cout<<"Enter a string"<<"\n";
for(i=0; str[i] != '\0'; i++) {
cin>>str[i];
}
for(int i=0; str[i]!='\0'; i++) {
cout<<str[i];
length++;
}
cout<<"\n"<<"Length of the string="<<""<<length<<"\n";
}
#包括
使用名称空间std;
int main(){
int长度=0,i;
char-str[10];
coutstr[i]!='\0'检查存储在str[i]的预先存在的数据,而不是用户输入值。以下是我注意到的一些问题:
在初始化之前,您正在检查str
的内容
您假设从流中获取的字符串将以null结尾,但事实并非如此
您没有检查cin是否正常工作
如果不检查字符串是否小于等于10个字符,则可能导致溢出超过缓冲区的末尾
在检查数组长度时,再次假定字符串以null结尾
如果您想解决这些问题并仍然使用字符缓冲区,请参阅user4581301的综合答案。但是,我建议您只需切换到std::string即可。
例如:
#include<iostream>
using namespace std;
int main()
{
string str;
cout<<"Enter a string"<<"\n";
if (cin >> str) {
cout << str << endl;
cout << "Length of the string = " << str.length() << endl;
}
}
std::string str;
for(char c; cin>>c && c!=/*add your termination cond. here*/;)
str += c;
#包括
使用名称空间std;
int main()
{
字符串str;
cout添加字符串初始化:
char str[10] = {'\0'};
并将读数更改为:
char c;
for(int i = 0; cin>> c && c!=/*add your termination cond. here*/ && i < 10;++i)
str[i] = c;
您可以逐个字符读取并将其存储在str[i]
中;但在选中str[i]!='\0'
之前,您可以先递增i++
这种方法有两个问题:首先,检查某个位置的值,该位置在该时间点尚未写入。其次,cin>>str[i]
永远不会写入字符串终止字符-它只读取有效字符,如果输入被终止(例如,通过EOF),则不会写入任何内容
所以你的做法是错误的
如果您希望最多读取10个字符直到新行(即当用户按enter键时),请使用fgets
。或者-这是首选选项-使用cin
并写入std::string
-对象
int main()
{
std::string str;
cin >> str;
std::cout << str << std::endl;
}
intmain()
{
std::字符串str;
cin>>str;
STD:太长了,读不下去了
使用str[i]
在赋值之前。程序可能在为str
分配的内存块中发现了一个空字符,并提前停止,但从技术上讲,如果使用未初始化的变量,可能会发生任何情况。例如,在找到空字符之前,您得到了预期的结果3次。程序永远找不到空字符,并且永远奔跑。可能会下独角兽雨。任何事
int i = 0;
do {
cin>>str[i];
} while (str[i++] != '\0');
读取然后测试。但是流中的数据行不是C样式的字符串,并且不会以null结尾
int i = 0;
do {
cin>>str[i];
} while (!std::isspace(str[i++]));
在找到空白时退出,通常表示单词的结尾,而不是null
但是如果由于某种原因,cin>>str[i];
失败了怎么办
int i = 0;
do {
cin>>str[i];
} while (cin && !std::isspace(str[i++]));
添加一个测试以确保某些内容已被读取。但是如果有超过10个字符,并且char str[10];
溢出了怎么办
int i = 0;
do {
cin>>str[i];
} while (cin && !std::isspace(str[i]) && ++i < sizeof(str));
我认为这涵盖了你在这里可能遇到的一切。你应该学习。for(I=0;str[I]!='\0';I++)…
在这行中str[I]
有未定义的内容(因为你从未初始化过str
),你无法测试它的值。for(I=0;str[I]!='\0';I++
for(I=0;I
,读取未初始化的数据会调用未定义的行为。for(i=0;str[i]!='\0';i++){
哪个str[i]将包含一个‘0’?切换到STD::String…我们生活在C++世界中。代码STR < /COD>在检查之前被取消,所以检查实际上不需要发生。恐怕没有。在流中没有空字符的保证。流不是C风格字符串。没关系,看起来已经有一些好的解释建议插件了。g不管怎么说,答案确实会不时被删除,你应该努力做到自给自足。好吧,我添加了我注意到的东西,但我也指出了你的答案,因为我认为这是如何使用字符缓冲区的一个很好的分解。它不会破坏循环,因为循环检查输入的字符,而不是string本身。你是对的,它对维护人员不友好,但这不是问题。str[i]
中的while
-测试没有初始化。你需要测试str[i-1]
@peje你看到了一些我没有看到的东西。请解释。@user4581301:cin>>str[i];i++}while(…isspace(str[i])
测试到目前为止尚未写入str
的值。。。
int i = 0;
do {
cin>>str[i];
} while (cin && !std::isspace(str[i++]));
int i = 0;
do {
cin>>str[i];
} while (cin && !std::isspace(str[i]) && ++i < sizeof(str));
int i = 0;
do {
cin>>str[i];
} while (cin && !std::isspace(str[i]) && ++i < sizeof(str));
if (i == sizeof(str))
{
str[sizeof(str)-1] = '\0';
}