【问题标题】:whenever I try to run this code the break appears or stops working每当我尝试运行此代码时,都会出现中断或停止工作
【发布时间】:2017-02-26 18:14:28
【问题描述】:

我想做的是: 输入来自用户的句子。使用句号、空格和逗号作为单词分隔符。每个单词都应该存储在一个 2D 数组中,其列的大小各不相同,每一行都将一个单词存储为一个以 NULL 结尾的字符串。

例如,如果用户输入:

Hello how are you? 它应该存储为:

H E l l o NULL

h o w NULL

a r e NULL

y o u ? NULL

所以每当我尝试运行我的代码时,都会出现此错误

Exception thrown at 0x00832605 in Project109.exe: 0xC0000005: Access violation writing location 0xFDFDFE03.   

或者程序停止工作。主要问题在
ptr[i][j] = str1[j];

`

char str1[20];
cin.get(str1, 20);

int  len, sum = 0;
len = strlen(str1);
int i = 0;

while (str1[i] != '\0')
{
    if (str1[i] == ' ' || str1[i] == '.' || str1[i] == ',' || str1[i] == '?' || str1[i] == ';')
    {
        sum = sum + 1;
    }
    i++;
}

char **ptr;
ptr = new char*[sum];
for (int i = 0; i < sum; i++)
{

    ptr[i] = new char[20];


}


for (int i = 0; i < sum; i++)
{

for (int j = 0; j < 20; j++)
{
    ptr[i][j] = '\0';
}}


for (int i = 0; i < sum; i++)
{
    for (int j = 0; j < 20; j++)
    {

        if (str1[j] == ' ' || str1[j] == '.' || str1[j] == ',' || str1[j] == '?' || str1[j] == ';')
        {
            i++;
        }

        else
        {

            ptr[i][j] = str1[j];

        }
    }
}
for (int i = 0; i < sum; i++)
{
    int j = 0;
    while (ptr[i][j] != '\0')
    {
        cout << ptr[i][j];
        j++;
    }
}


for (int i = 0; i < sum; i++)
{
    delete[] ptr[i];
}
delete[] ptr;


system("pause");
return 0;}

`

【问题讨论】:

  • 我已经提到了编译器指向的地方:ptr[i][j] = str1[j];
  • @HamzaSaeed:嗯,那行代码大错特错。在您的示例中,wstr1[8],应该以ptr[1][2] 结尾,但j 不可能同时是82
  • 我从代码中删除了空初始化。现在它可以工作了,但会显示带有其他角色的垃圾......

标签: c++ arrays pointers visual-c++


【解决方案1】:

您的索引超出范围,并使用包含 0xFDfence bytes 访问内存。

考虑一下这里的循环

for (int i = 0; i < sum; i++)
{
    for (int j = 0; j < 20; j++)
    {
        if (str1[j] == ' ' || str1[j] == '.' || str1[j] == ',' || str1[j] == '?' || str1[j] == ';')
        {
            i++;
        }
        else
        {
            ptr[i][j] = str1[j];
        }
    }
}

如果i 已经处于(或接近)它的最大值,则在内部循环中,您可能会在达到ptr[i][j] = str1[j]; 之前将其递增一次或多次。那时i 可能比sum 更多。

【讨论】:

    【解决方案2】:

    更好的解决方案,但输出不是所需的:

    {  char str1[20];
    cin.get(str1, 20);
    
    int  len, sum = 0;
    len = strlen(str1);
    int i = 0;
    
    while (str1[i] != '\0')
    {
        if (str1[i] == ' ' || str1[i] == '.' || str1[i] == ',' || str1[i] == '?' || str1[i] == ';')
        {
            sum = sum + 1;
        }
        i++;
    }
    
    char **ptr;
    ptr = new char*[sum];
    for (int i = 0; i < sum; i++)
    {
    
        ptr[i] = new char[len];
    
    
    }
    
    
    
    for (int i = 0; i < sum; i++)
    {
        for (int j = 0; j < len; j++)
        {
    
            if (str1[j] == ' ' || str1[j] == '.' || str1[j] == ',' || str1[j] == '?' || str1[j] == ';')
            {
                ptr[i][j] = str1[j];
                i++;
            }
    
            else
            {
    
                ptr[i][j] = str1[j];
    
            }
        }
    }
    
    for (int i = 0; i < sum; i++)
    {
        for (int j = 0; j < len; j++)
        {
            cout << ptr[i][j];
    
        }
        cout << endl;
    }
    for (int i = 0; i < sum; i++)
    {
        delete[] ptr[i];
    }
    delete[] ptr;
    
    
    system("pause");
    return 0;}
    

    【讨论】:

      猜你喜欢
      • 2022-11-07
      • 2018-10-07
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2021-12-24
      • 2020-05-18
      • 1970-01-01
      相关资源
      最近更新 更多