web-dev-qa-db-ja.com

関数呼び出しで識別子が見つからないというエラー

入力した文字列の大文字と小文字を逆にするプログラムがあります。これは私の.cppファイルのコードであり、Visual Studio C++ IDEを使用しています。ヘッダーファイルに何が必要なのか、この作業を行うために必要なのかわからない。

関数呼び出しswapCaseでエラーが発生しました。 Mainには、わからない何らかの理由でswapCaseが表示されません。

#include <cctype>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    char name[30];
    cout<<"Enter a name: ";
    cin.getline(name, 30);
    swapCase(name);
    cout<<"Changed case is: "<< name <<endl;
    _getch();
    return 0;
}

void swapCase (char* name)
{
    for(int i=0;name[i];i++)
    {
        if ( name[i] >= 'A' && name[i] <= 'Z' )
            name[i] += 32; //changing upper to lower
        else if( name[i] >= 'a' && name[i] <= 'z')
            name[i] -= 32; //changing lower to upper
    }
}

構文またはセマンティクスに関するその他のヒントを歓迎します。

48
KRB

メイン関数の前に次の行を追加します。

void swapCase (char* name);

int main()
{
   ...
   swapCase(name);    // swapCase prototype should be known at this point
   ...
}

これは前方宣言と呼ばれます。コンパイラーは、関数呼び出しがコンパイルされるときに関数プロトタイプを知る必要があります。

77
Alex F

慣れ親しんでいる他の言語とは異なり、C++のすべてを使用する前に宣言する必要があります。コンパイラはソースファイルを上から下に読み取ります。したがって、swapCaseの呼び出しに到達すると、それが何であるかが分からないため、エラーが発生します。次のような行を使用して、mainの前に関数を宣言できます。

void swapCase(char *name);

または、その関数全体をファイル内のmainの前に単純に移動できます。ファイルの一番下にあると思われる最も重要な機能(メイン)について心配する必要はありません。 CまたはC++でそれを行うことは非常に一般的です。

16

コンパイラーは、main()でswapCaseの呼び出しを検出すると、関数swapCaseを認識しないため、エラーを報告します。 swapCaseのdefinitionをmainの上に移動するか、またはdeclare swapケースをmainの上に移動できます。

void swapCase(char* name);

また、swapCaseの32により、リーダーは一時停止して不思議に思います。コメントは役に立ちます!このコンテキストでは、次のように書くとわかりやすくなります。

if ('A' <= name[i] && name[i] <= 'Z')
    name[i] += 'a' - 'A';
else if ('a' <= name[i] && name[i] <= 'z')
    name[i] += 'A' - 'a';

私のifテストの構成は個人的なスタイルの問題です。あなたは大丈夫だった。主なものは、name [i]を変更する方法です-'a'と 'A'の違いを使用すると、何が起こっているかがより明確になり、'32 'が実際に正しいかどうか誰も気にする必要はありません。

頑張って学習してください!

8
Kevin Hopps

メイン定義の前にvoid swapCaseを定義する必要があります。

0
v01d