C++ c++;在我的程序中出现奇怪的崩溃 #包括 使用名称空间std; int main() { int a=0,skrb=0,j=0; char b,simboliai[2000]; char zodis[50][20]; 字符检查[1][20]={'f'}; cout-1;i++) { if((simboliai[i]='s'&&simboliai[i++]='')| |(simboliai[i]='s'&&simboliai[i++]='\n')) { 勾选[0][a]=“t”; } if(simboliai[i]='') { a++; } 其他的 { zodis[i][a]=simboliai[i]; } if(simboliai[i]='\n') { 打破 } } a=0; 而(1) { 如果(simboliai[a]='.| | | simboliai[a]='.,'| | simboliai[a]='!'| | simboliai[a]='.?')) { skrb++; } a++; 如果(simboliai[a]='\n') { 打破 } } a=0; 库特

C++ c++;在我的程序中出现奇怪的崩溃 #包括 使用名称空间std; int main() { int a=0,skrb=0,j=0; char b,simboliai[2000]; char zodis[50][20]; 字符检查[1][20]={'f'}; cout-1;i++) { if((simboliai[i]='s'&&simboliai[i++]='')| |(simboliai[i]='s'&&simboliai[i++]='\n')) { 勾选[0][a]=“t”; } if(simboliai[i]='') { a++; } 其他的 { zodis[i][a]=simboliai[i]; } if(simboliai[i]='\n') { 打破 } } a=0; 而(1) { 如果(simboliai[a]='.| | | simboliai[a]='.,'| | simboliai[a]='!'| | simboliai[a]='.?')) { skrb++; } a++; 如果(simboliai[a]='\n') { 打破 } } a=0; 库特,c++,arrays,char,C++,Arrays,Char,这是主要的问题。可能还有其他问题,但我没有仔细寻找 i的值将为0、1、2等。 它们都大于-1。 循环将继续,直到值i达到INT\u MAX(不确定当i在此时递增时会发生什么情况) 无论如何,这远远大于数组simboliai的大小。您的程序将访问超出有效限制的数组simboliai,并导致未定义的行为 我想你需要的是: for (int i = 0; i > -1; i++) { ... } 如果你说for循环不会将字符1乘以1,那是在你的“simboliai[i++]=''逻辑中。

这是主要的问题。可能还有其他问题,但我没有仔细寻找

i
的值将为0、1、2等。
它们都大于-1。
循环将继续,直到值
i
达到INT\u MAX(不确定当
i
在此时递增时会发生什么情况)

无论如何,这远远大于数组
simboliai
的大小。您的程序将访问超出有效限制的数组
simboliai
,并导致未定义的行为

我想你需要的是:

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

如果你说for循环不会将字符1乘以1,那是在你的“simboliai[i++]=''逻辑中。当当前字符为“s”时,整数“i”在每个循环中递增两次,这意味着如果simboliai[i]='s,它将从i=2递增到i=4。使用i+1代替检查。

for(int i=0;i>-1;i++)……也因为这是C++,所以使用<代码>字符串< /C> >而不是字符串数组。<代码>(SimBuriai[i]='s'&& SimbIIa[i++]=='')
不幸的是,这永远不会是真的。循环体中有一个
中断
条件。@Ari0nhh,这不会达到,因为
istream::getline
读取并丢弃换行符。@R Sahu我知道)但问题作者很可能不是,所以他不会理解为什么他的循环是无限的。
(simboliai[i]='s'&&simboliai[i++]='')
也很难看。我为那个循环设置了中断。所以它会在要求的条件下停止。但问题是,我被要求用字符数组生成一个代码。程序必须从用户那里读入单词,然后打印出以字母“s”结尾的单词,并且所有操作都必须只使用字符类型。自从您检查字符类型后,它应该在每个循环中递增3倍simboliai[i]='s'两次。是的,这确实帮助了我。但似乎char数组在符号放置方面与其他数组有点不同,所以我想我需要解决这个问题。
for (int i = 0; i > -1; i++)
{
   ...
}
size_t len = strlen(simboliai);
for (size_t i = 0; i < len; i++)
{
   ...
}
#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] == '\0'))
      {
         check[0][a] = 't';
      }
      if (simboliai[i] == ' ')
      {
         zodis[word_counter][a] = '\0';
         a = 0;
         ++word_counter;
      }
      else
      {
         zodis[word_counter][a] = simboliai[i];
         ++a;
      }
   }

   a = 0;
   while ( simboliai[a] != '\0' )
   {
      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();
}