int iPassCode, iNumber = 0;
void main()
{
iNumber = get_name();
iPassCode = get_code();
name_strucutre();
}
int get_name()
{
printf("Please enter your name: ");
cName[MAX_NAME_LEN] = getchar();
if(strcmp(cName,"leia"||"Leia"))
{
iNumber = 1;
}
if(strcmp(cName,"darth"||"Darth"))
{
iNumber = 2;
}
if(strcmp(cName,"r2d2"||"R2D2"))
{
iNumber = 3;
}
if(strcmp(cName,"solo"||"Solo"))
{
iNumber = 4;
}
if(strcmp(cName,"jabba"||"Jabba"))
{
iNumber = 5;
}
if(strcmp(cName,"yoda"||"Yoda"))
{
iNumber = 6;
}
else
{
iNumber = 0;
}
return(iNumber);
}
int get_code()
{
printf("Please enter your pass code: ");
scanf("%d", iPassCode);
return (iPassCode);
}
我在这里得到了一些功能。其中一个我认为get name()
函数导致程序崩溃。现在,我尝试做的就是从用户那里收集名称和密码并将信息传递回main()
。我不想通过一个单数来传递整个名字。
答案 0 :(得分:3)
有很多问题,让我们一个一个地分析它们
首先,
cName[MAX_NAME_LEN] = getchar();
无效,因为
根据最新标准,默认为int
不再是标准。您需要定义数据类型
对getchar()
的一次调用会读取一个char
。至少你需要一个循环。
您需要更改为
char cName[MAX_NAME_LEN] = {0};
然后循环getchar()
以读取输入。
否则,为了更好,请使用fgets()
来读取和存储输入。
也就是说,您无法在单个调用中比较多个字符串,如
if(strcmp(cName,"leia"||"Leia"))
这基本上是
if(strcmp(cName,1))
这又是非法的。您可以使用strcasecmp()
忽略该案例。否则,要严格遵守标准,您必须使用单独的strcmp()
调用来将字符串与每个验证器进行比较。
是的,strcmp()
会在成功(匹配)时返回0
。
您正在写
scanf("%d", iPassCode);
应该是
scanf("%d", &iPassCode); //missed the address-of
毕竟,从编码风格的角度来看,让我补充一点,return
是一个关键字,不要让它看起来像一个函数调用。
答案 1 :(得分:3)
表达式strcmp(cName,"leia"||"Leia")
相当于strcmp(cName, 1)
。
子表达式"leia"||"Leia"
是 true ,在C中等同于1
。
如果您想检查字符串是否相等,则需要进行两次strcmp
来电:strcmp(cName,"leia") == 0 || strcmp(cName,"Leia") == 0
。
答案 2 :(得分:0)
看看这些错误:
您正在使用
scanf("%d",iPassCode);
为了阅读,但你已宣布
c := t.Content[0]
if c != '.' && c != ',' && c != '?' && c != '“' && c != '”'{
而int iPassCode;
需要读取指针。
将其替换为
scanf
另一个错误是比较字符串的方式。用以下格式替换所有比较:
scanf("%d", &iPassCode);
此外,您不能将if ( (strcmp(cName,"something") == 0) || (strcmp(cName,"something") == 0) )
作为有效声明。
cName[MAX_NAME_LEN] = getchar();
,否则就应该。