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

我建议声明(在你的main函数中,或者作为全局变量)

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

您不希望这些变量在case-s 内的每个块中都是本地的。

和编码类似的东西

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

您可能想检查字符串是否为空,例如if (servername.empty())...

顺便说一句,您似乎没有用标准 C++ 编写代码:函数名称_tmain不是标准的开头(使用int main(int argc, char**argv))。

于 2013-10-05T08:37:51.177 回答
0

编译器不喜欢您声明相同的变量serverserverName在相同的范围内(即切换范围)。请注意,如果您{};在每个 case 块周围添加一个,那将起作用:

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

但是,这些变量在这些范围之外将不可用。对于您要执行的操作,您需要将变量放在main作用域中,然后在 switch 案例中更改它们。

另外,我建议使用字符串,因为数组需要立即声明大小,或者在开关内使用指针和 malloc。

于 2013-10-05T08:39:12.207 回答
0

您的 server 和 serverName 变量有两个问题。首先,它们在 switch 块内部定义,在 switch 块外部不可见。其次,它们在该块中被多次定义。

完成此操作的一种方法是将 serverName 定义为 switch 块之前的 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

问题是case块都属于同一个范围。

即使您在声明之间有一个中断,编译器也不关心。server serverName它所看到的只是多次声明的相同变量。这也不是您想要的,因为在 switch 语句之后您将无法访问它们。

您需要做的是在 switch 语句之前声明它们并为它们分配一些明显错误的值(例如"undefined")。

只需确保您的默认案例正确处理事情,并且您不会使用您分配的默认值继续执行。

于 2013-10-05T08:37:31.037 回答