C:将字符串字面值转换为int数组



我有一个函数,以int数组作为参数。int数组表示一个字符串,但必须能够包含EOF,因此不能是char[]类型。我的函数看起来像这样:

_Bool fun(int str[]) {
  // does something involving checking elements for EOF, e.g.:
  return (str[0]==EOF);
}

出于测试目的,我想用字符串字面量调用fun(尽管字符串字面量自然是char[]类型,并且不能包含EOF),实际上是:

fun("test");

可以编译,但是有错误参数类型的警告。这是预期的,因为字符串字面值是char[],参数是int[]

我可以这样做:

fun( (int*) "test");

可能是等价的,只是我显式地进行了强制转换,相同的编译警告。

我正在阅读将char*转换为int*不能保证工作(链接)。这在一般情况下是很自然的,因为如果我现在尝试写一个大的intstr[some_index],它可能不适合- str[some_index]只有分配给char的内存(如果我错了请告诉我)。

但是因为我不会做任何这样的写,而只是比较(比较char和int应该是好的)-我对上面的任何一个都可以吗?在这种情况下如何消除编译警告?或者说解这个的最好方法是什么?

我当然可以写一个简单的函数来复制char数组的字符串文字给到一个int数组,值对值,但必须有一个更好的方法。这样的解决方案也会浪费内存。

(顺便说一下-当测试EOF时,我会这样做:

int str[] = {'t', 'e', 's', 't', EOF};
fun(str);

你建议的强制转换是一场灾难,除了编译器(有理由)抱怨它。

假设您使用的是小端(Intel)机器,该函数期望的内存布局是这样的(其中空白方块包含所有位为零):

+---+---+---+---+
| t |   |   |   |
+---+---+---+---+
| e |   |   |   |
+---+---+---+---+
| s |   |   |   |
+---+---+---+---+
| t |   |   |   |
+---+---+---+---+
|EOF|EOF|EOF|EOF|
+---+---+---+---+

你传递的是一个像这样的内存布局:

+---+---+---+---+
| t | e | s | t |
+---+---+---+---+
| | 
+---+

这完全不是一回事。这完全忽略了可能的对齐问题;你正在传递5个字节的数据,没有EOF标记来标记字符串的结束。

简洁地说,不要这样做!

OK, summary:

隐含或显式强制转换(分别为fun("test")fun( (int*) "test"))将做我想要的(详见Jonathan Lefflers的回答)。

这里的方法可能是编写一些自定义函数,将字符串字面值与EOF值结合起来,并将其全部作为int[]返回。

尝试与0进行比较,因为EOF是0的定义,而对应的字符是''

最新更新