Greetings to StackOverflowのコミュニティ!私は真剣に誰かの助けが必要です。
ここには、指定された文字列(str)の最短文のシンボルの最初と最後のインデックスである2つの整数を出力するはずのコードがあります。 ご覧のとおり、この文字列の最短文は "Hey !!!"です。文字 'H'のインデックスは16、最後の感嘆符のインデックスは21なので、正しい出力は次のようになります。16 21.
私はCppShell(cpp.sh)を使って自分のコードをコンパイルしました。同じコンパイラがそれを構築するために、それぞれの新しい試みで異なる結果が得られます。
試み#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;
}
多くのコードは、未定義の動作を提供します。例えば、 'ptr ++'はポインターの中のアドレスを追加し、ポインターの実際の値は追加しません。 C++では、charの配列の代わりにstd :: stringを使用することをお勧めします。 –
@mikebaykoそれはかなり一般的で、よく定義されています(多分C++のishではなく、Cの共通のイディオムです) –
ループの最初の繰り返しを見てください。最初の 'if'はfalseで、2番目の' if'では、初期化されていない変数( 'startsym'、' endsym')を使います。 – geza