【问题标题】:C programming: pass long integer to function and return a stringC 编程:将长整数传递给函数并返回一个字符串
【发布时间】:2020-05-23 13:17:51
【问题描述】:

C 编程:我需要将一个长整数 (N) 传递给函数并返回一个单词(字符串)“有效”或“无效”,但我正在努力正确地转换值。代码不起作用是因为我需要使用指针吗?您能否告知我应该如何修改代码以及为什么?

#include <stdio.h>
int digitmatch(long N); // function to match the first two digits of the card
int isvalid(long N);
int main()
{
   long N;
   N =    5212888888881881;
   printf("\n digit match: %d",digitmatch(N));
   printf("\n validity: %s",isvalid(N));
}  

int digitmatch(long N)
{
    long digit;
    digit = N;
    while (digit >= 100) 
    {
        digit /= 10;
    }
   return digit;
}

char isvalid(long N)
{  
   char valid[20];

    if (digitmatch(N) == 51 || digitmatch(N) == 52) 
    {
        valid = "MasterCard";
    }
    else
    {
        valid = "invalid";
    }
   return valid;
}

非常感谢

【问题讨论】:

  • char isvalid(long N) 返回 char,而不是字符串。
  • 信用卡号应该存储为字符串,而不是整数。
  • 编译时,始终启用警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std=gnu11)注意:其他编译器使用不同的选项来产生相同的结果。通过编译器运行发布的代码会产生 4 条警告消息和 3 条错误消息
  • 根本问题,首先是代码无法编译。改正后,我们可以讨论代码逻辑是否正确。

标签: c type-conversion


【解决方案1】:

在 C 语言中,字符串按照惯例是一个以空字符结尾的字符数组。 char 只是一个字符或字节。所以你希望isvalid 返回的不是字符,而是字符串。

但数组不是第一类对象,函数不能返回数组,程序员也不能赋值给数组。您只能返回数组第一个元素上的指针或将其分配给另一个指针。但这会导致下一个问题,因为在函数中声明的自动对象在函数返回时达到其生命周期的尽头。

在您的情况下,您可以为返回的字符串声明 2 个静态 (const) 数组:

char* isvalid(long N);    // initial declaration must match the definition...
...

const char* isvalid(long N)
{
    static char master[] = "MasterCard";// static arrays won't reach end of life at return
    static char invalid[] = "invalid";
    const char *valid;

    if (digitmatch(N) == 51 || digitmatch(N) == 52) 
    {
        valid = master;
    }
    else
    {
        valid = invalid;
    }
   return valid;
}

const 在这里用来通知调用者它不应该通过返回的指针改变任何东西。

【讨论】:

    【解决方案2】:

    在 C 中,字符串的类型为 const char*char*,因此您的函数应返回:

    const char* isvalid(long N)
    {  
    
        if (digitmatch(N) == 51 || digitmatch(N) == 52) 
        {
            return "MasterCard";
        }
        else
        {
            return "invalid";
        }
    }
    

    【讨论】:

      【解决方案3】:

      看这个:

      #include <stdio.h>
      
      const char* fun();          //return pointer to string
      
      int main()
      {
          printf("%s",fun());
          return 0;
      }
      
      const char* fun()
      {
          const char *ret = "Hello! World";  //This string is not placed in stack it is placed in .rodata, So it is not destroyed upon function return.
          return ret;
      }
      

      在你的情况下:

      const char* isvalid(long N)
      {  
          if (digitmatch(N) == 51 || digitmatch(N) == 52) 
          {
              return "MasterCard";
          }
          else
          {
              return "invalid";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多