C ++:相同的代码和编译器,但每次构建后输出不同

时间:2017-07-25 22:36:55

标签: c++ c++14

向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;
}

1 个答案:

答案 0 :(得分:2)

查看循环的第一次迭代。第一个if为false,然后在第二个if,您使用未初始化的变量(startsymendsym)。

也初始化这些变量,程序运行正常。对于此示例字符串,至少(我认为您需要解决其他边缘情况,以使此程序对每个字符串都正常工作)。

提示:

  • 使用调试器找出你的程序行为不端的原因(但是, 不幸的是,在这种特殊情况下,调试器可能不会告诉你 有什么问题。)
  • 如果使用MSVC,则可以打开未初始化变量的运行时检查(/ RTCu)
  • 如果您使用linux,则可以使用valgrind来捕获此错误(以及许多其他类型的错误)