【问题标题】:why the following code gives the first mobile no. irrespective of name为什么下面的代码给出了第一个手机号码。不问姓名
【发布时间】:2015-06-10 11:30:53
【问题描述】:

请解释为什么下面的代码给出了第一个手机号码。无论输入的名称如何:

#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;}}}}}}}}};

    };

【问题讨论】:

  • 你不应该使用 = 进行字符串比较

标签: c string switch-statement comparison


【解决方案1】:

您不能比较 字符串使用=(或者甚至==,就此而言)运算符。为此,您需要使用 strcmp()

在您的代码中,在 mobileno() 函数中,

if( s="katrina" )

本质上试图分配字符串字面量"katrina"s的基地址。它远不及比较

也就是说,

  1. 永远不要使用gets(),它会出现缓冲区溢出问题。使用更安全的选择,fgets()
  2. main() 的推荐签名是int main(void)

【讨论】:

    【解决方案2】:

    这段代码

    if( s="katrina" )
    

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

    【讨论】:

      【解决方案3】:

      在这个函数中

      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 被分配给字符串字面量“katrina”的第一个字符的地址,显然不等于 NULL。所以条件永远为真。:)

      如果您想与字符串进行比较,您应该使用标头 &lt;string.h&gt; 中声明的标准 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

      【讨论】:

        【解决方案4】:

        if 条件中有两个问题:

        if( s="katrina" )
        

        赋值而不是相等

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

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

        字符数组比较:使用 strcmp() 代替:

         if( strcmp(s,"katrina")==0 )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多