main()
{
char buff[10];
int a;
for(int i=0; i<10;i++)
{
cin >> buff[i];
a=sizeof(buff[i]);
if(a==10)
cout << "full";
}
for(int i=0; i<10;i++)
cout << buff[i]<<"\n";
}
为什么控制永远不会来到cout&lt;&lt; “充分”;我是新手编码...当我做干运行时它运作良好
答案 0 :(得分:4)
您已将buff
定义为char数组。然后你看看sizeof
其中一个char。 sizeof
运算符的结果仅取决于您传递的对象的类型作为其参数。在这种情况下,您所做的相当于sizeof(char)
,在C和C ++中定义为1。由于1不等于10,因此您的测试将始终生成false
。
编辑:顺便说一下,我的建议是备份,重新组合并重新开始。您通常不希望一次读取一个字符串,直到获得一些经验,您可能也不应该在C ++中使用数组。对于读取字符串的初始尝试,您通常需要的是:
#include <string>
#include <iostream>
int main() {
// define a string object to hold the data
std::string input;
// ask the user for some input
std::cout << "Please type something:";
// read data from the user:
std::getline(std::cin, input);
// we'll print it out again, to show what we got:
std::cout << input;
return 0;
}
Edit2:我应该补充一点,原始尝试(使用strlen
)至少比编辑版本更接近(使用sizeof
)。如果您确定 希望一次只读取一个字符串,那么正确使用strlen
会告诉您何时读取尽可能多的数据因为你腾出了空间。但正确使用并不一定完全明显。你需要更像这样的东西:
// Make room for 10 characters *plus* a terminating NUL and fill with NULs:
char buffer[11] = {0};
for (int i=0; i<10; i++) {
std::cin >> buffer[i];
if (strlen(buffer) == 10)
std::cout << "full";
}
但这仍然是无用的。 if (strlen ...
并没有真正从循环本身给出任何新的或不同的信息 - 当循环的最后一次迭代正在执行时(并且仅当)时,它将是真的。因此,它的结果几乎与您编写的内容相同:
for (int i=0; i<10; i++) {
std::cin >> buffer[i];
}
std::cout << "full";
最后一点:如上所示,使用C风格的字符串(char数组),字符串必须以NUL字符终止,因此您必须使用比字符串的最大长度多一个元素来定义数组你希望能够存储。
答案 1 :(得分:3)
因为在此代码中:
a=sizeof(buff[i]);
你得到的是buff
数组中某个元素的大小 - 而不是整个数组本身的大小。
由于数组中的元素为char
s,因此大小始终为1(由标准规定)。
如果你想获得元素的索引(也就是说,你想要点击第10个元素),你需要这样做:
if(i==9)
cout << "full";
(9
代替10
,因为数组从零开始,第10项位于buff[9]
。首先是buff[0]
,第二位是buff[1]
等等......)
答案 2 :(得分:0)
我认为这是因为您在strlen
上致电buff[i]
,当我猜您要在strlen
上致电buff
时。请记住,buff[i]
是一个字符。
答案 3 :(得分:0)
你的测试是
一个== 10
编辑因为约翰无法意识到在回答之后编辑了帖子的原始代码。所以请忽略以下3行,因为它们已被更正:
和a = strlen(buff [i]);
你基本上比较cin读取的1个字符,所以总是1和10总是返回false因此永远不会打印完整
你要测试的是
if(i == 9)
为什么9,因为你在你的循环中覆盖0到9(&lt; 10)
答案 4 :(得分:-1)
它被称为零基索引。 从0开始的10个数组位置。
0 1 2 3 4 5 6 7 8 9 = 10个地点。