C 在程序中遇到了怪异的崩溃


#include <iostream>

using namespace std;
int main()
{
    int a = 0, skrb = 0, j = 0;
    char b, simboliai[2000];
    char zodis[50][20]; 
    char check[1][20] = {'f'};
    cout << "Prasome irasykite sakini: ";
    cin.getline(simboliai,sizeof(simboliai));
//----------------- Zodziu skaidymas ----------------------------------------------------------------------------------------------------------
    a = 0;
    for (int i = 0; i > -1; i++)
    {
        if ((simboliai[i] == 's' && simboliai[i++] == ' ') || (simboliai[i] == 's' && simboliai[i++] == 'n'))
        {
            check[0][a] = 't';
        }
        if (simboliai[i] == ' ')
        {
            a++;
        }
        else
        {
            zodis[i][a] = simboliai[i];
        }
        if (simboliai[i] == 'n')
        {
            break;
        }
    }
    a = 0;
    while (1)
    {
        if (simboliai[a] == '.' || simboliai[a] == ',' || simboliai[a] == '!' || simboliai[a] == '?')
        {
            skrb++;
        }
        a++;
        if (simboliai[a] == 'n')
        {
            break;
        }
    }
    a = 0;
    cout << "Jus ivedete tokius zodius kurie baigiasi raide 's'" << endl;
    while(1)
    {
        if (zodis[j][a] == 'Ì')
        {
            cout << 'n';
            a++;
        }
        if (check[0][a] == 't')
        {
            cout << zodis[j][a];
        }
        if (zodis[0][a] == 'Ì')
        {
            break;
        }
    }
    cout << "Pas jus yra (.','!'?) simboliu: " << skrb << endl;
    cin.ignore();
    cin.get();
}

基本上,此程序可以起作用,但部分却毁了一切。它不会一个人字符。当我调试时,它表明程序已将符号放在其位置,但随后有„。所以看起来很像输入:单词Zodis [0] [0]就像Wìì确实一样,Zodis [1] [0] gone o o o ofer of of ofo ofer。预先感谢您。

如果您说的是for循环不会将字符1 x 1放置,则在您的" simboliai [i ] =='''"逻辑中。当当前字符为's'时,整数'i'被增加了两次,这意味着如果Simboliai [i] ='s'将从i = 2增加到i = 4。将I 1代替进行检查。

for (int i = 0; i > -1; i++)
{
   ...
}

是主要问题。可能还有其他人,但我对他们的看法不太接近。

i的值将为0、1、2。
所有这些都大于-1。
循环将继续进行,直到值i到达INT_MAX。(不确定当时i会增加时会发生什么(。

无论如何,它比数组simboliai的大小大。您的程序将访问数组simboliai超出有效限制并导致不确定的行为。

我认为您需要的是:

size_t len = strlen(simboliai);
for (size_t i = 0; i < len; i++)
{
   ...
}

其他问题

  1. 假设simboliai中有一个newline字符的假设导致了一些错误。该假设不正确。std::istream::getline读取并丢弃Newline字符。

  2. 如果Google翻译正确,则zodis应该包含一个单词列表。当您迭代simboliai的字符时,您需要三个计数器。

    1. 一个迭代simboliai的字符。
    2. 一个跟踪数字单词的一个。
    3. 一个可以跟踪当前单词中字符的数量。

    您的for循环没有这样做。

  3. 当您尝试访问数组的内容时,您需要始终编写防御代码,并确保永远不会使用界限索引访问数组。在最后一个while循环中,您没有这样做。

  4. 在最后一个while循环中,您仅在第一个if块中增加a。如果该if语句的条件对false进行了评估,则a永远不会增加,并且您会陷入无限循环中。

  5. 在最后一个循环中,您使用j作为索引,但其值在功能开始时将其值初始化为0,并且永远不会更新。目前尚不清楚最后一个while循环的意图是什么。因此,我不能说这是否是一个错误,但听起来可能是一个错误。

这是您已发布的代码的清理版本,但仍有一些未知的代码。

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
   int a = 0, skrb = 0, j = 0;
   char b, simboliai[2000];
   char zodis[50][20]; 
   char check[1][20] = {'f'};
   cout << "Prasome irasykite sakini: ";
   cin.getline(simboliai,sizeof(simboliai));
   //----------------- Zodziu skaidymas ----------------------------------------------------------------------------------------------------------
   int word_counter = 0;
   a = 0;
   size_t len = std::strlen(simboliai);
   for (size_t i = 0; i < len; i++)
   {
      if ((simboliai[i] == 's' && simboliai[i+1] == ' ') || (simboliai[i] == 's' && simboliai[i+1] == ''))
      {
         check[0][a] = 't';
      }
      if (simboliai[i] == ' ')
      {
         zodis[word_counter][a] = '';
         a = 0;
         ++word_counter;
      }
      else
      {
         zodis[word_counter][a] = simboliai[i];
         ++a;
      }
   }
   a = 0;
   while ( simboliai[a] != '' )
   {
      if (simboliai[a] == '.' || simboliai[a] == ',' || simboliai[a] == '!' || simboliai[a] == '?')
      {
         skrb++;
      }
      a++;
   }
   a = 0;
   cout << "Jus ivedete tokius zodius kurie baigiasi raide 's'" << endl;
   while( j < 50 && a < 20 )
   {
      if (zodis[j][a] == 'Ì')
      {
         cout << 'n';
      }
      if (check[0][a] == 't')
      {
         cout << zodis[j][a];
      }
      if (zodis[0][a] == 'Ì')
      {
         break;
      }
      a++;
   }
   cout << "Pas jus yra (.','!'?) simboliu: " << skrb << endl;
   cin.ignore();
   cin.get();
}

相关内容

最新更新