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; 
} 
+2

很多你的代码会给你未定义的行为。例如'ptr ++'将在指针内添加地址,而不是它指向的实际值。在C++中,我推荐使用std :: string而不是一个字符数组。 –

+2

@mikebayko它很常见,并且定义良好(也许它不是非常的C++ ish,而是C中常见的习惯用法) –

+2

看看循环的第一次迭代。第一个“if”为假,然后在第二个“if”时,使用未初始化的变量('startsym','endsym')。 – geza

看看你的循环的第一次迭代。第一个if为假,则在第二个if时,使用未初始化的变量(startsym,endsym)。

也初始化这些变量,并且你的程序将正常工作。对于这个示例字符串,至少(我认为你需要解决其他边缘情况,使这个程序工作正常,每个字符串)。

提示:

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

这有帮助!非常感谢! – vitdev