【问题标题】:Converting char 2d array to int 2d array将 char 2d 数组转换为 int 2d 数组
【发布时间】:2019-07-08 18:36:43
【问题描述】:

我正在尝试将二维数组的 char 转换为二维数组的 int,以便我可以获得每个字符的 ASCII 值,但是每当我打印输出时,我都会以十六进制输出。但是当我尝试将该十六进制转换为ASCII 值不等于任何 ASCII 值

#include <iostream>
using namespace std;
int main() {
    int n;
    cout<<"Enter input"<<endl;
    cin>>n;
    char a [n][50];
   int arr [n][50];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        arr[i][50]=a[i][50];
    }
    int count=0;
    for(int i=0;i<n;i++)
     {
       cout<<arr[i];
       cout<<endl;
     }
return 0;
}

我接受输出 65,但我得到的输出是 0x7ffee224f940。 我给出的输入是 A

【问题讨论】:

  • char a [n][50]; in standard c++ n 必须是编译时间常数。 stackoverflow.com/questions/1887097/…
  • arr[i][50]=a[i][50]; 是未定义的行为。您正在访问 1 超过二维数组的末尾。有效索引是 arr[0][0] 到 arr[n-1][49]
  • cin&gt;&gt;a[i]; 应该怎么做? [50]的目的是什么?
  • 在两个数组声明期间未在 n 的位置使用编译时已知的数字会调用未定义的行为,如果您不知道,这真的很糟糕,可能是您的来源的一部分崩溃(虽然这可能取决于你的编译器这次你是否可以摆脱它。不过,既然你崩溃了,我假设你没有。)。
  • arr[i] 计算为指向arr[i][0] 数据的指针,然后将其打印为指针。

标签: c++


【解决方案1】:

您正在尝试打印一个整数数组。您得到的十六进制输出是数组的地址,而不是内容。如果要获取单个字符的值,应该一个一个打印出来。

【讨论】:

    【解决方案2】:

    尽管一些编译器支持它自己的语言扩展,但可变长度数组

    cin>>n;
    char a [n][50];
    int arr [n][50];
    

    不是标准的 C++ 功能。所以他们最好使用标准容器std::vector

    好像在这句话里

    arr[i][50]=a[i][50];
    

    您正试图将一个数组分配给另一个数组。除了表达式不正确,数组没有赋值运算符。

    下面是一个演示程序,展示了如何执行您的任务。

    #include <iostream>
    #include <string>
    #include <limits>
    #include <array>
    #include <vector>
    #include <iterator>
    #include <algorithm>
    #include <cstring>
    
    int main() 
    {
        const size_t N = 50;
    
        std::cout << "Enter the number of strings: ";
    
        size_t n;
    
        std::cin >> n;
    
        std::vector<std::array<char, N>> strings( n );
        std::vector<std::array<int, N>> values( n );
    
        std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    
        for ( size_t i = 0; i < strings.size(); i++ )
        {
            std::cin.getline( strings[i].data(), N, '\n' );
        }
    
        for ( size_t i = 0; i < strings.size(); i++ )
        {
            std::cout << strings[i].data() << '\n';
        }
    
        for ( size_t i = 0; i < strings.size(); i++ )
        {
            size_t len = std::strlen( strings[i].data() ) + 1;
            std::copy( strings[i].data(), strings[i].data() + len, std::begin( values[i] ) );       
        }
    
        for ( const auto &row : values )
        {
            for ( auto it = std::begin( row ); *it != 0; ++it )
            {
                std::cout << *it << ' ';
            }
            std::cout << '\n';
        }
    
        return 0;
    }
    

    程序输出可能如下所示

    Enter the number of strings: 2
    Hello
    World
    72 101 108 108 111 
    87 111 114 108 100 
    

    【讨论】:

      【解决方案3】:

      您的代码存在 2 个主要问题。

      首先是这部分:

          int n;
          cout<<"Enter input"<<endl;
          cin>>n;
          char a [n][50];
          int arr [n][50];
      

      由于 n 在编译时未知,char a [n][50];int arr [n][50]; 是你不应该做的两件非常糟糕的事情。一些编译器可能会让你侥幸逃脱,但一般来说,数组声明需要提前知道大小。有关如何正确执行此操作的一些示例,请see the answers to this question

      问题 2:

      arr[i][50]=a[i][50];
      

      你在这里做的另一件非常糟糕的事情。 Array subscripts are 0 based,这意味着在您的示例中,没有 arr[i][50] 这样的东西。最后一个是arr[i][49]。链接的问题给出了它基于 0 的一些很好的理由,所以我不再赘述。只需知道,因为数组的第一个元素从 arr[i][0] 开始,您实际上必须访问比原始大小小 1 才能获取数组的最后一个元素。

      如您所见,不遵守这些准则至少会导致意外结果,最坏的情况是崩溃。

      【讨论】:

        【解决方案4】:

        让我们逐步深入研究您的代码:

        1. 要输入一个二维数组,您需要二维,即通常使用两个变量来定义数组中的单个元素。因此需要嵌套 for 循环,单个 for 循环就足够了。

        2. 数组索引从 0 开始,因此数组的最后一个元素只能是 n-1,或者这里 50-1=49。因此,指向索引为 50 的变量位置也是错误的。

        3. 分配 arr[i][j]=a[i][j] 是正确的,足以将字符转换为整数。

        因此更新了代码:

        #include <iostream>
        using namespace std;
        int main() 
        {
            int n;
            cout<<"Enter input"<<endl;
            cin>>n;
        
            //The 50 in the second parameter, implies that the column width will always be 50
            char a[n][50];
            int arr[n][50];
        
            for(int i=0;i<n;i++)
            {
                for(j=0;j<50;j++)
                {
                    cin>>a[i][j];
                    //Direct assignment to obtain the ascii value
                    arr[i][j]=int(a[i][j]);
                }
            }
        
        
            for(int i=0;i<n;i++)
            {
                for(j=0;j<50;j++)
                {
                    cout<<arr[i];
                    cout<<endl;
                }
            }
        
        return 0;
        }
        

        你可以了解更多关于二维数组here

        【讨论】:

        • 请注意诊断here
        • 是的,@Bob__ 我错过了循环变量的初始化。 :( 然而,可变大小数组自 2011 年以来已在 c++ 上实现,并且也用于许多编码网站。我认为现在在程序中使用它是安全的。
        猜你喜欢
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        • 2016-12-08
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2022-01-18
        • 2012-06-08
        相关资源
        最近更新 更多