为什么下面的代码给出了第一个手机号码。与名字无关

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。它远不及比较

也就是说,

  1. 切勿使用gets(),它会出现缓冲区溢出问题。使用更安全的替代方案,fgets()
  2. main()的推荐签名是int main(void)

此代码

if( s="katrina" )

将"katrina"赋值给s,结果不为0,即"true"。要进行比较,请改用 strcmp。虽然您可以用“==”比较值,但不要将它用于字符串,因为它只会比较地址,两个相同的字符串仍然可能有不同的地址。

你的if条件有两个问题:

if( s="katrina" )

赋值而不是相等 :

a=b表示将b的值赋值给a.

a==b' 表示检查 ab 是否具有相同的值。

字符数组比较:改用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.