C++:相同的代码和编译器,但每次构建后输出不同
问题描述:
向*的社区致以问候!我真的需要别人的帮助。
这是我的代码,应该打印两个整数,这是给定字符串(str)中最短句子符号的第一个和最后一个索引。正如你所看到的,这个字符串中最短的句子是“Hey !!!”;字符'H'的索引为16,最后一个感叹号的索引为21,因此正确的输出应该是:16 21.
我已经使用CppShell(cpp.sh)编译了我的代码,下面是处理:使用
尝试#1:1:16 21
尝试#2:145921712 4196790
尝试#3:16 21
尝试#4:16 21
尝试#相同的编译器在每一个新的尝试建立它给出不同的结果5:1453219648 4196790
等
请问有人能解释我这种奇怪的情况吗?我是C++的新手,因此我可能在代码中看不到一些明显的错误。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;
}
答
看看你的循环的第一次迭代。第一个if
为假,则在第二个if
时,使用未初始化的变量(startsym
,endsym
)。
也初始化这些变量,并且你的程序将正常工作。对于这个示例字符串,至少(我认为你需要解决其他边缘情况,使这个程序工作正常,每个字符串)。
提示:
- 使用调试器来找出为什么你的程序行为不端(但是, 不幸的是,在这种特殊情况下,调试器可能不会告诉你 什么问题)。
- 如果你使用MSVC,你可以打开运行时检查未初始化变量(/ RTCu)
- 如果你使用Linux,你可以使用的valgrind赶上这个错误(和许多其他类型的错误的)
+0
这有帮助!非常感谢! – vitdev
很多你的代码会给你未定义的行为。例如'ptr ++'将在指针内添加地址,而不是它指向的实际值。在C++中,我推荐使用std :: string而不是一个字符数组。 –
@mikebayko它很常见,并且定义良好(也许它不是非常的C++ ish,而是C中常见的习惯用法) –
看看循环的第一次迭代。第一个“if”为假,然后在第二个“if”时,使用未初始化的变量('startsym','endsym')。 – geza