#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++)
{
...
}
其他问题
假设
simboliai
中有一个newline字符的假设导致了一些错误。该假设不正确。std::istream::getline
读取并丢弃Newline字符。如果Google翻译正确,则
zodis
应该包含一个单词列表。当您迭代simboliai
的字符时,您需要三个计数器。- 一个迭代
simboliai
的字符。 - 一个跟踪数字单词的一个。
- 一个可以跟踪当前单词中字符的数量。
您的
for
循环没有这样做。- 一个迭代
当您尝试访问数组的内容时,您需要始终编写防御代码,并确保永远不会使用界限索引访问数组。在最后一个
while
循环中,您没有这样做。在最后一个
while
循环中,您仅在第一个if
块中增加a
。如果该if
语句的条件对false
进行了评估,则a
永远不会增加,并且您会陷入无限循环中。在最后一个循环中,您使用
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();
}