为什么下面的代码给出了第一个手机号码。与名字无关
why the following code gives the first mobile no. irrespective of name
请解释为什么下面的代码给出了第一个手机号码。与输入的名称无关:
#include<stdio.h>
#include<conio.h>
int mobileno(char[]);
int main(){
char input[20];
gets(input);
printf("%s",input);
int x;
x = mobileno(input);
printf("%d",x);
switch(x){
case 0:printf("7255222319");break;
case 1:printf("9404521113");break;
case 2:printf("9326513553");break;
case 3:printf("9845621611");break;
case 4:printf("4556312390");break;
case 5:printf("9245178190");break;
case 6:printf("9214188214");break;
case 7:printf("7014773244");break;
case 8:printf("7898888044");break;
};
getch();
return 0;
}
int mobileno(char s[20]){
if( s="katrina" )
{return 1;}else{
if( s="shahid" ){return 2;}else{
if( s="ranbir" ){return 3;}else{
if( s="sharukh" ){return 4;}else{
if( s="hema" ){return 5;}else{
if( s="amitabh" ){return 6;}else{
if( s="shashnk" ){return 7;}else{
if( s="raj" ){return 8;}else{
if( s="aishwarya" ){return 0;}else{
return 9;}}}}}}}}};
};
你不能比较 字符串使用=
(甚至==
)运算符.您需要为此使用 strcmp()
。
在您的代码中,在 mobileno()
函数内,
if( s="katrina" )
本质上试图分配字符串文字的基地址"katrina"
到 s
。它远不及比较。
也就是说,
- 切勿使用
gets()
,它会出现缓冲区溢出问题。使用更安全的替代方案,fgets()
main()
的推荐签名是int main(void)
此代码
if( s="katrina" )
将"katrina"赋值给s,结果不为0,即"true"。要进行比较,请改用 strcmp。虽然您可以用“==”比较值,但不要将它用于字符串,因为它只会比较地址,两个相同的字符串仍然可能有不同的地址。
你的if
条件有两个问题:
if( s="katrina" )
赋值而不是相等 :
a=b
表示将b
的值赋值给a
.
a==b'
表示检查 a
和 b
是否具有相同的值。
字符数组比较:改用strcmp():
if( strcmp(s,"katrina")==0 )
在这个函数中
int mobileno(char s[20]){
if( s="katrina" )
{return 1;}else{
if( s="shahid" ){return 2;}else{
if( s="ranbir" ){return 3;}else{
if( s="sharukh" ){return 4;}else{
if( s="hema" ){return 5;}else{
if( s="amitabh" ){return 6;}else{
if( s="shashnk" ){return 7;}else{
if( s="raj" ){return 8;}else{
if( s="aishwarya" ){return 0;}else{
return 9;}}}}}}}}};
};
使用了赋值运算符=
,在if条件下对字符串字面量的首字符进行地址赋值。例如在这个声明中
if( s="katrina" )
指针s被赋值给明显不等于NULL的字符串字面量"katrina"第一个字符的地址。所以条件总是正确的。:)
如果您想与字符串进行比较,您应该使用在 header <string.h>
中声明的标准 C 函数 strcmp
按如下方式重写函数
#include <string.h>
//...
int mobileno( const char *s )
{
const char *name[] =
{
"aishwarya", "katrina", "shahid", "ranbir", "sharukh",
"hema", "amitabh", "shashnk", "raj"
};
const size_t N = sizeof( name ) / sizeof( *name );
size_t i = 0;
while ( i < N && strcmp( s, name[i] ) != 0 ) i++;
return i;
}
考虑到函数 gets
不再是 C 标准函数,因为它不安全。改用函数 fgets
.
请解释为什么下面的代码给出了第一个手机号码。与输入的名称无关:
#include<stdio.h>
#include<conio.h>
int mobileno(char[]);
int main(){
char input[20];
gets(input);
printf("%s",input);
int x;
x = mobileno(input);
printf("%d",x);
switch(x){
case 0:printf("7255222319");break;
case 1:printf("9404521113");break;
case 2:printf("9326513553");break;
case 3:printf("9845621611");break;
case 4:printf("4556312390");break;
case 5:printf("9245178190");break;
case 6:printf("9214188214");break;
case 7:printf("7014773244");break;
case 8:printf("7898888044");break;
};
getch();
return 0;
}
int mobileno(char s[20]){
if( s="katrina" )
{return 1;}else{
if( s="shahid" ){return 2;}else{
if( s="ranbir" ){return 3;}else{
if( s="sharukh" ){return 4;}else{
if( s="hema" ){return 5;}else{
if( s="amitabh" ){return 6;}else{
if( s="shashnk" ){return 7;}else{
if( s="raj" ){return 8;}else{
if( s="aishwarya" ){return 0;}else{
return 9;}}}}}}}}};
};
你不能比较 字符串使用=
(甚至==
)运算符.您需要为此使用 strcmp()
。
在您的代码中,在 mobileno()
函数内,
if( s="katrina" )
本质上试图分配字符串文字的基地址"katrina"
到 s
。它远不及比较。
也就是说,
- 切勿使用
gets()
,它会出现缓冲区溢出问题。使用更安全的替代方案,fgets()
main()
的推荐签名是int main(void)
此代码
if( s="katrina" )
将"katrina"赋值给s,结果不为0,即"true"。要进行比较,请改用 strcmp。虽然您可以用“==”比较值,但不要将它用于字符串,因为它只会比较地址,两个相同的字符串仍然可能有不同的地址。
你的if
条件有两个问题:
if( s="katrina" )
赋值而不是相等 :
a=b
表示将b
的值赋值给a
.
a==b'
表示检查 a
和 b
是否具有相同的值。
字符数组比较:改用strcmp():
if( strcmp(s,"katrina")==0 )
在这个函数中
int mobileno(char s[20]){
if( s="katrina" )
{return 1;}else{
if( s="shahid" ){return 2;}else{
if( s="ranbir" ){return 3;}else{
if( s="sharukh" ){return 4;}else{
if( s="hema" ){return 5;}else{
if( s="amitabh" ){return 6;}else{
if( s="shashnk" ){return 7;}else{
if( s="raj" ){return 8;}else{
if( s="aishwarya" ){return 0;}else{
return 9;}}}}}}}}};
};
使用了赋值运算符=
,在if条件下对字符串字面量的首字符进行地址赋值。例如在这个声明中
if( s="katrina" )
指针s被赋值给明显不等于NULL的字符串字面量"katrina"第一个字符的地址。所以条件总是正确的。:)
如果您想与字符串进行比较,您应该使用在 header <string.h>
strcmp
按如下方式重写函数
#include <string.h>
//...
int mobileno( const char *s )
{
const char *name[] =
{
"aishwarya", "katrina", "shahid", "ranbir", "sharukh",
"hema", "amitabh", "shashnk", "raj"
};
const size_t N = sizeof( name ) / sizeof( *name );
size_t i = 0;
while ( i < N && strcmp( s, name[i] ) != 0 ) i++;
return i;
}
考虑到函数 gets
不再是 C 标准函数,因为它不安全。改用函数 fgets
.