2017-01-20 18 views
-4
int main(void) 
{ 
    string n = GetString(); 
    if(n!=NULL){ 
     for(int i=0, j=strlen(n); i<j; i++){ 
      if(!isalpha(n[i-1]) && isalpha(n[i])){ 
       printf("%c", toupper(n[i])); 
      } 
     } 
    } 
} 

場合(!はisalpha(名[I-1])& &はisalpha(名[I]))この行は新しいスターターに説明できるかこのコード行は何をしていますか? [初心者]

?(コードは、ハーバード大学のCS50のIDEで正常に動作する方法)

+8

[未定義の動作](http://en.cppreference.com/w/cpp/language/ub) – George

+1

をコンポーネントの断片に分解してデバッガで実行します - それであなた自身に説明します(そして、騒ぎにならない)。そして、いいえ、それは(あなたが意図した結果として未定義の振る舞いを定義しない限り)正しく動作しません! – KevinDTimm

+0

@KevinDTimmハーバードのCS50 IDEで動作します。 – alemst11

答えて

1

でコードがでているアルファベット文字を印刷し、アルファベット文字と、それぞれ1で続く配列nにアルファベット以外の文字のすべての出現を見つけるためにしようとしています大文字。

iの値が0で始まるため、コードは配列の開始前に文字にアクセスするため、最初の反復では未定義の動作をします。

コードがcs50で正常に動作しているように見えるかもしれませんが、それはうっかりです。定義されていない動作の1つの特徴は、エラーや予期しない結果を生成する必要がないことです。しかし、それは正しいことではありません。それは単に、いくつかの状況において観察可能な症状を引き起こさなかったことを意味します。

注:議論のために、私はstringcharへのポインタで、GetString()charの配列の最初の文字のアドレスを返すことを想定しています。

関連する問題