2015-10-07 43 views
-5

这段代码错在哪里? 它不会让我投strlen(s)int,我可以重复它,直到i等于字符串的长度。strlen to int C++ - 为什么我不能这样做?

#include <iostream> 
#include <string.h> 
#include <string> 

using namespace std; 

int main() 
{ 

    string s; 
    cin >> s; 

    for (int i = 0; int n = (int)strlen(s); i < n, i++) 
    { 
     cout << s[i] << endl; 
    } 
} 
+0

使用's.size()''strlen'为'char'阵列字符串。 – 101010

+0

我必须更改头文件吗? –

+1

你只需要#include '#include ' – 101010

回答

0

因为strlen期望得到一个char const*,因为它的参数。您应该使用s.size()而不是sstd::string

此外,你应该不应该计算strlen像这样的循环由于性能问题(另一方面s.size应该能够在O(1)时间内完成,所以它会好的)。

然后还有一些其他的问题,你的程序,已经在一行。您不能使用#include //iostream包含文件,而应该使用#include <iostream>

其次,你不能在for循环的条件中声明一个变量,你可能不应该分配而不是比较(一个等号是而不是与2相同)。你应该写下for(int i = 0; i != s.size(); i++)

第三,你不应该在for结构的更新表达式中进行检查。那里的东西只会被评估为更新循环变量等,真实值将被忽略。

总的来说,我认为你应该拿起介绍C++的书或在网上找到一个很好的教程。你的代码只需要很多问题就可以得出结论,即你已经学会了最基本的C++。

+0

我正在学习CS50,而不是C++。我被迫在C++中学习CS50的工作方式,因为我无法运行虚拟计算机,但谢谢。 –

+0

// ... //因为它看起来不像在后文章中会显示#include

+1

@LouisGermanotta在这种情况下,看起来你必须学习C++作为课程的一部分或必备条件,在最基本的... – skyking

3

问题不是strlen的结果不能转换为int,而是strlen不能用于std::string

strlen为“C字符串”,字符的零封端的阵列。

std::string具有size成员函数:

int main() 
{ 
    string s; 
    cin >> s; 
    for (int i = 0; i < s.size(); i++) 
    { 
     cout << s[i] << endl; 
    } 
} 

有C头<string.h>应用于std::string内什么。
reference可以是有用的。

+0

如果你想编译时没有警告,它应该是'size_t i'。 –

0

strlenchar阵列。

std::string有一个名为sizelength的成员函数。

如果您仍想使用strlen,可以拨打c_str并将返回的字符串传递给strlen

std::size_t length = s.size(); 
for (int i = 0; i < length; ++i) 

也可以遍历std::string的元素:

for (std::string::iterator itr = s.begin(); itr != s.end(); ++itr) 
{ 
    std::cout << *itr << std::endl; 
} 
相关问题