向StackOverflow社区致以问候!我真的需要别人的帮助。
这是我的代码,它应该打印两个整数,它们是给定(str)字符串中最短句子符号的第一个和最后一个索引。
如你所见,这个字符串中最短的句子是“嘿!!!”;字符'H'的索引为16,最后一个感叹号的索引为21,因此正确的输出应为:16 21.
我使用CppShell(cpp.sh)编译了我的代码,这是交易:使用相同编译器编译的相同代码在每次尝试构建它时都会产生不同的结果:
尝试#1:16 21
尝试#2:145921712 4196790
尝试#3:16 21
尝试#4:16 21
尝试#5:1453219648 4196790
等
有人可以解释一下这种奇怪的情况吗?我是C ++的新手,因此我的代码中可能没有看到一些明显的错误。
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
setlocale(LC_CTYPE, "rus");
char str[] = " What's up? Hey!!! It's a practice... How are you?? ";
char* ptr = str;
char* p = ptr;
int startsym, endsym;
int startsymMin = 0, endsymMin = 2000;
while(*ptr)
{
if (*ptr > 64 && *ptr < 91) // capitalized letters 'A'-'Z'
{
startsym = strchr(ptr, *ptr)-p;
while(*ptr)
{
if ((*ptr == '!' && *(ptr+1) != '!' && *(ptr+1) != '?')
|| (*ptr == '?' && *(ptr+1) != '!' && *(ptr+1) != '?')
|| (*ptr == '.' && *(ptr+1) != '.'))
{
endsym = strchr(ptr, *ptr)-p;
break;
}
ptr++;
}
}
if (endsym - startsym < endsymMin - startsymMin) {
startsymMin = startsym;
endsymMin = endsym;
}
ptr++;
}
cout << startsymMin << " " << endsymMin << endl;
return 0;
}
答案 0 :(得分:2)
查看循环的第一次迭代。第一个if
为false,然后在第二个if
,您使用未初始化的变量(startsym
,endsym
)。
也初始化这些变量,程序运行正常。对于此示例字符串,至少(我认为您需要解决其他边缘情况,以使此程序对每个字符串都正常工作)。
提示: