c 读取字符串导致崩溃
c read string is causing a crash
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()
。我不想传回整个名字,尽管只是一个单数。
看看这些错误:
您正在使用
scanf("%d", iPassCode);
为了阅读,但你已经声明了
int iPassCode;
而 scanf
需要读取指针。
替换为
scanf("%d", &iPassCode);
另一个错误是你比较字符串的方式。用以下格式替换所有比较:
if ( (strcmp(cName,"something") == 0) || (strcmp(cName,"something") == 0) )
此外,您不能将 cName[MAX_NAME_LEN] = getchar();
作为有效声明。
- 最后我想你已经在某处定义了
MAX_NAME_LEN
,否则你应该。
问题很多,我们一一分析
首先,
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()
returns 0
成功(匹配).
你正在写
scanf("%d", iPassCode);
应该是
scanf("%d", &iPassCode); //missed the address-of
说了这么多,从编码风格的角度,再补充一点,return
是关键字,不要让它看起来像函数调用。
表达式 strcmp(cName,"leia"||"Leia")
等价于 strcmp(cName, 1)
.
子表达式 "leia"||"Leia"
是 true,在 C 中等价于 1
.
如果你想检查一个字符串是否相等,你需要两次 strcmp
调用:strcmp(cName,"leia") == 0 || strcmp(cName,"Leia") == 0
.
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()
。我不想传回整个名字,尽管只是一个单数。
看看这些错误:
您正在使用
scanf("%d", iPassCode);
为了阅读,但你已经声明了
int iPassCode;
而 scanf
需要读取指针。
替换为
scanf("%d", &iPassCode);
另一个错误是你比较字符串的方式。用以下格式替换所有比较:
if ( (strcmp(cName,"something") == 0) || (strcmp(cName,"something") == 0) )
此外,您不能将
cName[MAX_NAME_LEN] = getchar();
作为有效声明。- 最后我想你已经在某处定义了
MAX_NAME_LEN
,否则你应该。
问题很多,我们一一分析
首先,
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()
returns0
成功(匹配).你正在写
scanf("%d", iPassCode);
应该是
scanf("%d", &iPassCode); //missed the address-of
说了这么多,从编码风格的角度,再补充一点,return
是关键字,不要让它看起来像函数调用。
表达式 strcmp(cName,"leia"||"Leia")
等价于 strcmp(cName, 1)
.
子表达式 "leia"||"Leia"
是 true,在 C 中等价于 1
.
如果你想检查一个字符串是否相等,你需要两次 strcmp
调用:strcmp(cName,"leia") == 0 || strcmp(cName,"Leia") == 0
.