【问题标题】:C question about passing a string as a function agrument关于将字符串作为函数参数传递的 C 问题
【发布时间】:2011-08-03 00:36:42
【问题描述】:

我想将一个字符串传递给这样的函数..

 long_var = get_value("long_value");
 short_var = get_value("short_value");

在函数内部,我做了这个..

double get_value(char *get_type){

   if  (*get_type == "short_value")
   {
        //calculate and return
    }
   else if  (*get_type == "long_value")
   {
         //calculate and return
    }  
}

但是,我有一个错误 错误:main.c(334):“flash unsigned char [11]”类型的函数参数 #1 与“unsigned char *”类型的必需参数不兼容

我认为字符串只是一个 char 数组,我可以调用它..

另外,有没有更好的方法来做到这一点..

谢谢..

【问题讨论】:

  • 第 314 行是哪一个?我可以告诉你,你需要使用 strcmp。
  • 什么是 flash unsigned char[11]?
  • 当我用字符串参数调用函数时编译器报错
  • 它不应该抱怨。这是您的实际代码吗?它不应该抱怨。这是您的实际代码吗?

标签: c


【解决方案1】:

您将需要包含<string.h> 并将您的代码更改为说

 if (!strcmp(get_type, "short_value"))

现在的情况是,您将字符 (*get_type) 与指向字符 ("short_value") 的指针进行比较。

【讨论】:

  • 您的代码错误。想一想:如果两个字符串相等,strcmp() 会返回什么?
  • 我在微控制器平台,我想避免使用string.h
  • @Programming Enthusiast - 然后不要使用字符串。使用enum(或#defines)拥有可以使用==(和switch on)测试的名称。
  • 那就不要使用字符串了!
【解决方案2】:

您应该将常量字符串传递为“const char*”甚至“const char * const”。 此外,c-strings 是普通数组,对它们使用 == 操作只会比较指针,而不是字符串。您应该使用 strcmp 函数进行比较。

【讨论】:

  • const * char * 指针太多,但const char * 是传递(非可变)字符串的正确方法。
  • 哦,对不起,暂时的大脑功能障碍,当然我的意思是 const * char const
  • 确定你现在不是指const char * const
  • 嗯,凌晨 3:54。深信不疑。这些不是我要找的机器人。
【解决方案3】:

字符串字面量的类型为const char[],在函数调用中衰减为const char *,因此您应该对函数进行签名double get_value(const char *)

其次,当你取消引用*get_type 时,你只会得到一个字符,而不是整个字符串!然后你试图将该 char 与一个数组(再次衰减为一个指针)进行比较——这是行不通的。您需要的是strcmp(或其变体版本):

if (!strcmp(get_type, "short_value")) { ... }`

如果你愿意,你可以说 strncmp(get_type, "short_value", 12) 并且只比较最初的 12 个字符,这是“short_value”的长度,包括它的终止空字节 - 不是绝对必要的,但是最好知道一个人的字符串长度使用字符串操作函数。

【讨论】:

  • @David - 我个人更喜欢!strcmp 而不是strcmp == 0,但我想这取决于你的编码标准。我通常不测试字符串是大于还是小于其他字符串,只有当它们等于其他字符串时才测试,所以我永远不会被!strcmp 与其他比较的不对称性弄乱。 (或者要真的很邪恶,你可以做#define STRCMP(x, op, y) (strcmp((x), (y)) op 0)并允许人们做if(STRCMP("this", ==, "that"))
  • @Kerrek SB - “让人们永远不要使用strcmp”不是我的精神目标。教条地避免一个有时对一个稍微安全一点的函数不安全的函数并不是一个好的编程方法。首先确保您的代码是安全的(例如通过测试)是一种更好的做法。
  • 这种方式怎么样,它有效,但不太清楚.. ` #define long_value 1 #define short_value 2 double get_value(unsigned int); double get_value(unsigned int get_type){ if (get_type == short_value ) { //计算并返回 } else if (get_type == long_value) { //计算并返回 } }`
  • @Programming Enthusiast:您实际上是在描述enum,无论如何这将是比字符串比较更好的解决方案。
  • @Programming:首先你想比较字符串,现在你担心枚举的效率? :-) 但说真的,#define 和枚举都是整数值,最终可能占用相同的最小空间(一个寄存器),所以我更喜欢枚举的语义性质而不是愚蠢的宏。跨度>
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2010-10-03
  • 2022-01-16
  • 2020-08-16
相关资源
最近更新 更多