0

私は C++ に非常に慣れていないので、ここ数日独学で勉強しています。私の質問が明らかであるか、以前に尋ねられた場合は、前もってお詫び申し上げます。解決策を何度も検索しましたが、表示されるすべての解決策は、私の直感が必要だと言っているよりも複雑であり、一般的に頭を悩ませています。 .. とにかく、長いイントロで申し訳ありませんが、私の質問に:

多肢選択式の質問からの入力に基づいて、wchar_t 配列 (これは単なる Unicode 文字列ですか?) の値を決定しようとしているだけです (または値を推測します... 配列はまだ少し怖いです)。

これが私がこれまでにやってきたことです:

#include "stdafx.h"
#include <iostream>
#include <string>
#include "easendmailobj.tlh"
using namespace EASendMailObjLib;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    const int MAX = 65;
//char server[MAX], serverName[MAX], userName[MAX], password[MAX], from[MAX], to[MAX], msg[160];

//Choosing a SMTP server
int choice = 0;
bool logon = true;
bool ssl = true;
cout << "1)Gmail\n"
     << "2)Yahoo\n"
     << "3)Hotmail\n"
     << "4)None (Experemental)\n"
     << "5)Other (Advanced)\n"
     << "What kind of E-mail would you like to send from?:";
cin >> choice;

switch(choice) {
    case 1: wchar_t server[] = _T("smtp.gmail.com");
            char serverName[] = "Gmail";
            break;
    case 2: wchar_t server[] = _T("smtp.mail.yahoo.com");
            char serverName[] = "Yahoo";
            ssl = false;
            break;
    case 3: wchar_t server[] = _T("smtp.live.com");
            char serverName[] = "Hotmail";
            break;
    case 4: wchar_t server[] = _T("");
            logon = false;
            ssl = false;
            break;
    case 5: cout << "Enter your server:";
            char server[MAX];
            wcin.getline(server, MAX, '\n');
            cout << "Does your server require a login? (true or false):";
            cin >> logon;
            cout << "Does your server require an SSL connection? (true or false):";
            cin >> ssl;
            break;
    default: cout << endl <<"You entered a wrong number, restart, and try again."
                  << endl;
    }
}

これはすべて問題ないように見えますが、コンパイルしようとすると、同じ変数を複数回宣言することに関するあらゆる種類のエラーがスローされます。最初にすべてを宣言してから、選択に基づいて定義しますが、私が読んだ限りでは、C++ では不可能です。

ここで本当に立ち往生しています。ご理解とご協力をよろしくお願いいたします。

4

4 に答える 4

0

問題は、case ブロックがすべて同じスコープに属していることです。

宣言の間に休憩があっても、コンパイラは気にしません。server serverName表示されるのは、複数回宣言された同じ変数だけです。これは、switch ステートメントの後でそれらにアクセスできなくなるため、必要なものではありません。

あなたがする必要があるのは、switch ステートメントの前にそれらを宣言し、明らかに間違った値 (たとえば"undefined") を割り当てることです。

デフォルトのケースが物事を正しく処理することを確認し、割り当てたデフォルト値で実行を続行しないでください。

于 2013-10-05T08:37:31.037 に答える
0

宣言することをお勧めします(main関数内、またはグローバルとして)

 std::string server;
 std::string servername;

caseこれらの変数を-s内の各ブロックに対してローカルにしないでください。

そして次のようなコーディング

 case 1: server = "smtp.gmail.com";
         servername = "gmail";
         break;

たとえば、文字列が空かどうかを確認したい場合がありますif (servername.empty())...

ところで、あなたは標準の C++ でコーディングしていないようです: 関数名_tmainは最初から標準ではありません (use int main(int argc, char**argv))。

于 2013-10-05T08:37:51.177 に答える
0

server 変数と serverName 変数には 2 つの問題があります。まず、スイッチ ブロックの内部で定義され、スイッチ ブロックの外部では表示されません。第二に、それらはそれぞれそのブロックで複数回定義されています。

これを行う 1 つの方法は、switch ブロックの前に serverName を char ポインターとして定義し、代入を使用して各 case 句で設定することです。server[] 変数で同じことを行います。

const char *serverName="";
const wchar_t *server = _T("");
switch(choice) {
    case 1: server = _T("smtp.gmail.com");
            serverName = "Gmail";
            break;
    case 2: server = _T("smtp.mail.yahoo.com");
            serverName = "Yahoo";
            ssl = false;
            break;
    ...etc.
}
于 2013-10-05T08:46:31.947 に答える
0

serverコンパイラは、同じ変数をserverName同じスコープ (switch スコープ) で宣言することを好みません。{};各ケース ブロックの周りに追加すると、次のように動作することに注意してください。

case 1: {wchar_t server[] = _T("smtp.gmail.com");
        char serverName[] = "Gmail";
        break;};

ただし、変数はこれらの各スコープの外では使用できません。あなたがやろうとしていることについては、変数をmainスコープに入れてから、スイッチケース内で変更する必要があります。

また、配列の場合はすぐにサイズを宣言するか、スイッチ内でポインターと malloc を使用する必要があるため、文字列を使用することをお勧めします。

于 2013-10-05T08:39:12.207 に答える