0

该程序工作得很好..但是如果我想将我的用户名限制为 8 个字符,我应该怎么做??

 cout  << "Enter your Username  it should have a maximum limit of 8 characters\n "  << endl; 
getline(cin, user, '\n');

我想在这里它应该限制用户 8 个字符 .. 如果大于 8 .. 那么它应该继续询问用户(while 循环??)),直到用户输入少于 8 个字符。

4

3 回答 3

1
int mystrcmp(const char *s1, const char *s2)

{

while (*s1==*s2)

{

if(*s1=='\0')

return(0);

s1++;

s2++; }

return 1;//return(*s1-*s2);

}

您的 int mystrcmp(const char *s1, const char *s2) 正在返回字符串 s1 和 s2 中第一个不匹配字符的 ascii 值的差异,并且它并不总是 1,因为您的代码应该如此。

可以在此处找到代码的干净实现ideone 链接

于 2013-09-16T19:51:00.603 回答
0

您有一些混淆,特别是在 C++ 字符串和 C 字符串之间。

您的mystrcpy函数是尝试复制 C 样式字符串,但在 C++ 中不是必需的。以下是您在 C++ 中的操作方法。替换这个

mystrcpy(new_user,user)

有了这个

new_user = user;

如您所见,复制 C++ 字符串比复制 C 字符串要容易一些。您可以删除该mystrcpy功能。

同样,您的mystrcmp函数是尝试比较 C 字符串。同样,在 C++ 中它不是必需的。替换这个

f = mystrcmp(user2,new_user);
if (f==0)
{
    cout << "Successful Login!! \n "; 
}

有了这个

if (user2 == new_user)
{
    cout << "Successful Login!! \n "; 
}

您可以再次看到比较 C++ 字符串比比较 C 字符串更容易。您可以再次删除该mystrcmp功能。

逻辑上还有一些其他错误,还有一些缺少分号,但我会让你弄清楚这些。

于 2013-09-16T19:53:35.320 回答
0

您的代码几乎无处不在。例如:

  1. #include <string>如果您要使用std::string.

  2. cin >> a; if ( a == 1 )- 如果用户根本不输入整数怎么办?您将比较未初始化的 与 的值int1这会将您置于未定义的行为领域。您应该检查从 的返回cin,或至少初始化a

  3. 正如约翰所提到的,您读入std::strings,然后尝试将它们视为 C 字符串。不要,只需使用new_user = userand if ( user2 == new_user )

  4. 如果用户不这样做,"Enter 1 to enter Signup Screen"您无论如何都会将他们带到注册屏幕。

  5. 在你的mystrcmp()函数中,你return 0if *s1 == '\0',但你没有检查 if *s2 == '\0'。这意味着两件事 - 一,如果s2比 短s1,那么你会越界并再次调用未定义的行为,二,如果s2比长于s1但以s1(例如,如果s1包含"billy"s2包含"billybob")开头,那么你的函数会说它们是不相等时相等。

  6. 同样在您的mystrcmp()函数中, this:return(*s1-*s2)将始终返回与 的最后一个索引具有相同索引0的元素的值,或者如果更短,它将调用未定义的行为,如前所述。无论哪种方式,它几乎肯定不是你想要返回的东西。s2s1s2

  7. mystrcpy(target,source)不是有效的函数定义。此函数也仅将 的第一个字符复制source到 的第一个字符target

  8. 当您在错误的输入之后循环时,您检查if (f == 0)and if (f == 1),但您从未f在此循环期间设置,因此无论用户输入什么,您将始终检查初始结果是什么,无论他们接下来输入什么。

于 2013-09-16T20:19:10.660 回答