该程序工作得很好..但是如果我想将我的用户名限制为 8 个字符,我应该怎么做??
cout << "Enter your Username it should have a maximum limit of 8 characters\n " << endl;
getline(cin, user, '\n');
我想在这里它应该限制用户 8 个字符 .. 如果大于 8 .. 那么它应该继续询问用户(while 循环??)),直到用户输入少于 8 个字符。
该程序工作得很好..但是如果我想将我的用户名限制为 8 个字符,我应该怎么做??
cout << "Enter your Username it should have a maximum limit of 8 characters\n " << endl;
getline(cin, user, '\n');
我想在这里它应该限制用户 8 个字符 .. 如果大于 8 .. 那么它应该继续询问用户(while 循环??)),直到用户输入少于 8 个字符。
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 链接
您有一些混淆,特别是在 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
功能。
逻辑上还有一些其他错误,还有一些缺少分号,但我会让你弄清楚这些。
您的代码几乎无处不在。例如:
#include <string>
如果您要使用std::string
.
cin >> a; if ( a == 1 )
- 如果用户根本不输入整数怎么办?您将比较未初始化的 与 的值int
,1
这会将您置于未定义的行为领域。您应该检查从 的返回cin
,或至少初始化a
。
正如约翰所提到的,您读入std::string
s,然后尝试将它们视为 C 字符串。不要,只需使用new_user = user
and if ( user2 == new_user )
。
如果用户不这样做,"Enter 1 to enter Signup Screen"
您无论如何都会将他们带到注册屏幕。
在你的mystrcmp()
函数中,你return 0
if *s1 == '\0'
,但你没有检查 if *s2 == '\0'
。这意味着两件事 - 一,如果s2
比 短s1
,那么你会越界并再次调用未定义的行为,二,如果s2
比长于s1
但以s1
(例如,如果s1
包含"billy"
和s2
包含"billybob"
)开头,那么你的函数会说它们是不相等时相等。
同样在您的mystrcmp()
函数中, this:return(*s1-*s2)
将始终返回与 的最后一个索引具有相同索引0
的元素的值,或者如果更短,它将调用未定义的行为,如前所述。无论哪种方式,它几乎肯定不是你想要返回的东西。s2
s1
s2
mystrcpy(target,source)
不是有效的函数定义。此函数也仅将 的第一个字符复制source
到 的第一个字符target
。
当您在错误的输入之后循环时,您检查if (f == 0)
and if (f == 1)
,但您从未f
在此循环期间设置,因此无论用户输入什么,您将始终检查初始结果是什么,无论他们接下来输入什么。