在C语言中:用字符串和整数元素比较数组

在C语言中:用字符串和整数元素比较数组,c,arrays,C,Arrays,在C中:我编写了一个函数,用于检查类型为int的子数组arr2是否“按原样”存在于同一类型的数组arr1。如果在arr1中以完全相同的顺序找到arr2的所有元素,则返回1,否则返回0。该函数似乎工作正常,但我有两个问题: Q1:如果我们想对两个数组中的混合类型的元素执行相同的操作,特别是如果我们事先不知道将使用哪些类型的元素以及使用的顺序,该怎么办?我的意思是,每个元素的类型和它们的外观顺序都必须由用户自行决定。我读过很多类似的问答,但我仍然不清楚解决方案 Q2:考虑下面的例子: int a

在C中:我编写了一个函数,用于检查类型为
int
的子数组
arr2
是否“按原样”存在于同一类型的数组
arr1
。如果在
arr1
中以完全相同的顺序找到
arr2
的所有元素,则返回1,否则返回0。该函数似乎工作正常,但我有两个问题:

Q1:如果我们想对两个数组中的混合类型的元素执行相同的操作,特别是如果我们事先不知道将使用哪些类型的元素以及使用的顺序,该怎么办?我的意思是,每个元素的类型和它们的外观顺序都必须由用户自行决定。我读过很多类似的问答,但我仍然不清楚解决方案

<强> Q2:考虑下面的例子:

int arr1[] = {34, 231, "not the declared type..", "..recognized nevertheless", 3, 7};

int arr2[] = {231, "not the declared type..", "..recognized nevertheless"};
为什么我的函数实际工作(例如,在上述情况下返回1)?我认为它应该失败——因为使用的元素不是声明的类型(
int
)——或者更糟的是,我会得到一个编译器错误。相反,它似乎成功了,因为它能够恰当地识别和比较最后一个句号或大写字母。好吧,浮点数确实会失败(我猜它会将它们转换为整数,并只比较整数部分?),但为什么在其他情况下它会正常呢?它也会转换字符串吗?会发生什么样的转换

我对C和论坛都很陌生,所以请原谅我的无知

c中的数组是同质的,也就是说,所有元素都是相同的类型。您描述的示例:

int arr1[] = {34, 231, "not the declared type..", "..recognized nevertheless", 3, 7};
是无效代码。初始值设定项必须全部为
int
,(或者表达式可以隐式转换为
int

如果编译器没有为此代码生成诊断消息,则需要在编译器上提高警告级别

作为非标准扩展,某些编译器可能会将字符串转换为表示字符串第一个字符的内存地址的整数。但C标准规定,在执行此操作时必须输出诊断消息

为什么我的函数实际起作用

诀窍在于,在C中,您可以这样做,但结果肯定不能可靠地满足OP的需要

int arr1[] = {34, 231, "not the declared type..", "..recognized nevertheless", 3, 7};

int arr2[] = {231, "not the declared type..", "..recognized nevertheless"};
作为
int
数组的列表初始值设定项,每个字符串文字(如
“不是声明的类型.”
)将转换为第一个元素的地址:a
char*
。由于数组需要
int
,因此会发生
char*
int
的转换,这将生成警告。这在技术上是允许的,但不推荐。将
char*
转换为
int
本身就是一个问题。当指针指向整数转换有一定意义时,它“应该”转换为
void*
,然后转换为可选支持的
intptr\t类型的特殊大小整数。该整数类型足够宽,可以往返返回到有效指针
int
可能不够宽

int
的转换可能会丢失信息,因此结果现在可能是指针的哈希码(例如,其最低32位)。即使是相同内容的两个字符串文字也可能转换为相同的
int
,因为同一位置可能存在,也可能不存在。两个字符串文字可能会转换为相同的
int
,但具有不同的内容-哈希冲突。事情可能看起来是可行的,但不便于携带/不可靠


故事时间结束:C允许OP有很多绳子,足以挂起程序。这里没有安全网。

我想我找到了第二个问题的答案,那就是(绕过)调试器,事实上:为了阻止控制台窗口关闭,我一直使用Control+F5快捷方式,我现在意识到它在没有调试器的情况下运行应用程序。我只是用F5试了一下,虽然程序仍然成功运行,但还是出现了一些错误(对我来说不是很有帮助)。然而,我仍然不明白这是怎么可能的。我认为只有两种情况:一种语言的语法是正确的,另一种语言的语法是错误的。这显然是错误的。为什么它在做的事情上成功了


我的第一个问题仍然有效。谢谢。

您不能将字符串/字符数组作为元素放入int数组,可能您正在放入指针,这些指针是相同的。编译器应该用警告来回答您的问题,即使警告设置为最低级别。您使用的是哪种编译器?它没有打印任何警告吗?除非您真的知道自己在做什么,否则您应该将C编译器警告视为致命错误。是的,这就是我所期望的:警告。但正如我所说,没有警告,而且它正确地比较了阵列!您需要查看构建输出窗口以查看警告。正如我所说的,我认为这是无效代码,这就是为什么我要问这个问题。我不知道如何提高编译器的警告级别。我是使用Microsoft Studio 2015的初学者。如果编译器仅将字符串转换为字符串的第一个字符的地址,那么为什么它会识别其余字符的差异?@spra如果您在程序中两次使用同一字符串文字,那么编译器可能会决定只分配该文字的一个副本,因此,在测试代码中,如果在两个不同的数组中使用相同的字符串,那么这两个数组都可以转换为相同的整数。(如果文字长度不同,但尾部重合,也可能发生这种情况)请确保实际检查VS的“生成输出”窗口,以查看是否存在任何消息,从这个和上面的答案中,我了解到,由于不安全的转换,它可能会成功,也可能不会成功。首先,我真的无意使用这样一种不合理的语法。我只是想了解。答案很有帮助。它并不像可能的那样“不安全”