该程序工作正常..但在字符串中,如果我想将我的用户名限制为8个字符,我该怎么办? ?
cout << "Enter your Username it should have a maximum limit of 8 characters\n " << endl;
getline(cin, user, '\n');
我想在这里它应该限制用户8个字符..如果大于8 ..然后它应该继续询问 user(while loop ??))直到用户输入的字符少于8 ..
答案 0 :(得分: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)返回差异b / w字符串s1和s2中第一个非匹配字符的ascii值,它不总是1,就像你的代码一样。< / p>
您可以在ideone link
找到代码的简洁实现答案 1 :(得分: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
功能。
还有一些其他的错误,在逻辑中,还有一些缺失的冒号,但我会让你知道这些错误。
答案 2 :(得分:0)
你的代码几乎到处都是。例如:
如果您要使用#include <string>
,则需要std::string
。
cin >> a; if ( a == 1 )
- 如果用户根本没有输入整数怎么办?您将比较未初始化int
与1
的值,这会将您置于未定义的行为范围内。您应该从cin
检查退货,或至少初始化a
。
正如约翰所提到的那样,你在std::string
中读到了,然后尝试将它们视为C字符串。不要,只需使用new_user = user
和if ( user2 == new_user )
。
如果用户没有"Enter 1 to enter Signup Screen"
,则无论如何都要将它们带到注册屏幕。
在mystrcmp()
函数中,如果return 0
,则*s1 == '\0'
,但您未检查*s2 == '\0'
。这意味着两件事 - 一件事,如果s2
比s1
短,那么你就会超出界限并再次调用未定义的行为,如果s2
长于{{ 1}}但是以s1
开头(例如s1
包含s1
而"billy"
包含s2
),那么你的函数会说它们相等
同样在您的"billybob"
函数中,这个:mystrcmp()
将始终返回return(*s1-*s2)
减去0
元素的值,其索引与最后一个s2
索引,或者如果s1
更短,它将调用未定义的行为,如前所述。无论哪种方式,几乎肯定不是你想要回归的东西。
s2
不是有效的函数定义。此功能还仅将mystrcpy(target,source)
的第一个字符复制到source
的第一个字符。
当您在错误输入后循环时,您会检查target
和if (f == 0)
,但在此循环期间从未设置if (f == 1)
,因此无论用户输入什么,总是只是检查初始结果是什么,不管他们下一步是什么。