字符串到char []为空?

时间:2013-10-24 10:53:22

标签: c++

我做了一些广泛的搜索,但没有找到适合我的东西,所以我道歉。

char Name[20];

string transferfile;
ifstream file("file.txt");

while (file)
{
    getline(file, transferstring, ',');
    memcpy(Name, transferString.c_str(), sizeof(transferString));
    cout << Name << endl;
}

虽然编译得很好但它在名字中没有给我任何东西。我尝试过其他一些方法但仍然没有运气。正确的数据被放入transfertring中作为'cout&lt;&lt; transferstring;”打印正确的数据。

任何人都知道为什么这不起作用?

4 个答案:

答案 0 :(得分:2)

sizeof的使用不正确。这只是告诉你持有字符串的对象的大小。但是你需要字符串的长度,加上一个用于null终止符。你应该写:

memcpy(Name, transferString.c_str(), transferString.size()+1);

虽然注意到你的代码是缓冲区溢出只是等待发生。你需要在实际代码中防范它。

我还会添加通常的评论,因为这是C ++,您希望使用std::copy而不是memcpy

答案 1 :(得分:1)

我假设transferStringstd::string - 在这种情况下,使用sizeof代替transferString.size()

您可能还需要在结尾添加另一个\0字符。

无论如何,你在这里做的事情是相当危险的,如果可能的话,我会尽量避免使用C数组。

答案 2 :(得分:0)

我可以看到您的代码存在一些问题:

  • 您尝试在std :: string上使用sizeof(正如其他答案所指出的那样)

  • 你在C ++中使用memcpy(考虑用迭代器作为替代的std :: copy);您还尝试将读取数据的大小复制到char[20]。如果文件中的数据在第一个','字符之前包含长度超过20的字符串,则会产生缓冲区溢出。

  • 在复制值之前,您不会检查读取操作的结果。

您的代码应该/可能是:

while ( getline(file, transferstring, ',') ) // check the state of 
                                             // the stream after getline
{
    cout << transferString << endl;
}

如果要复制到名称中,请使用以下方法之一:

char *name = nullptr;
while ( getline(file, transferstring, ',') )
{
    name = new char[transferstring.size() + 1];
    std::copy(transferstring.begin(), transferstring.end(), name);
    name[transferstring.size()] = 0;
}
// somewhere later:
delete []name;

或:

char name[20];
while ( getline(file, transferstring, ',') )
{
    std::size_t size = std::min(transferstring.size(), 19);
    std::copy_n(transferstring.begin(), size, name); // copy at most 19 characters
    name[size] = 0;
}

我的选择虽然根本不使用char数组并将值保存在std :: string中。

答案 3 :(得分:0)

//an alternative way when stl isn't working
    #include <iostream>
    #include <string>
    #include <fstream>

    using namespace std;

    int main()
    {
        char Name[20];

        string transferfile;
        ifstream in("file.txt");

        while (!(in.eof()))//read till the end of the file
        {
            in>>transferfile;
                if(!in.eof())
                {
                    for(int i=0;i<transferfile.length();i++)//copy al the letters from the string
                {
                    Name[i] = transferfile[i];
                }
                for(int i=0;i<transferfile.length();i++)//print the array 
                {
                    cout<<Name[i];
                }
            }
        }

    }