字符串到整数转换

时间:2015-10-12 10:40:26

标签: c++

程序1:程序1从控制台获取一行输入,并将输入字符串分成由空格分隔的子字符串,然后转换为整数值。

    #include <cstring>
    #include <iostream>
    #include <stdlib.h> 

    using namespace std;

    int main() 
    { 
    char *input;
    cin.getline(input,100);

    char *token = strtok(input, " ");
    while (token != NULL) 
    {
    cout << token << '\n';
    token = strtok(NULL, " ");
    }

    return 0;
    }

计划2:

    #include <cstring>
    #include <iostream>
    #include <stdlib.h> 

    using namespace std;

    int main() 
    { 
    char *input;
    cin.getline(input,100);
    int a[7];
    char *token = strtok(input, " ");
    while (token != NULL) 
    {
    cout << token << '\n';
    token = strtok(NULL, " ");
    }

    return 0;
    }

程序1工作正常但程序不起作用。两个程序之间的唯一区别是,一个额外的数组a [7]变量。该变量如何导致程序2崩溃。

3 个答案:

答案 0 :(得分:2)

因为未定义的行为。

您永远不会为input分配内存,因此将其与getline一起使用是未定义的行为。

看起来你只想阅读一些文字并将其打印出来,分成空格。您可以在std::string上使用operator>>std::cin来获取此信息。

答案 1 :(得分:1)

正如其他人所说,你得到一个未定义的行为,因为你没有为input分配内存。

您可以通过声明char数组或以更“C ++方式”执行操作来解决问题。这是一个例子:

[run it online]

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

int main() 
{
    std::vector<int> a;

    cout << "Enter a sequence of numbers: ";

    std::copy(std::istream_iterator<int>(cin),
              std::istream_iterator<int>(),
              std::back_inserter(a));

    cout << "You've entered: ";     
    for (auto& num : a)
    {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

如果您仍希望将输入限制为100i.e. 'd'),则可以getline()cin到您用于初始化的std::string例如std::istringstream iss。然后std::copy()代码相同,只需将cin替换为iss

// #include <sstream>
std::string input;
cin.getline(input, 100);
std::istringstream iss(input);

答案 2 :(得分:0)

您尚未为input分配任何内存以指向,并且使用未初始化的指针调用getline未定义的行为

这意味着任何事情都可能发生,包括您的计划按预期工作,或者没有按预期工作。添加int a[7]只是改变了程序的内存布局,从而改变了未定义行为的行为。

要解决此问题,您只需将input设为所需长度的静态数组:

char input[100];
相关问题