我是 C 语言的新手,我在使用 If 语句将用户输入的字符与存储在数组中的 int 进行比较时遇到了问题。
例如:
int i[2] = {1,2};
char input[3];
printf("Select option:");
fgets(input,3,stdin);
if(strcmp(*input,i[0]) == 0)
printf("1 chosen");
if(strcmp(*input,i[1]) == 0)
printf("2 chosen");
编译时,我收到两个比较语句的警告:
warning: passing argument 1 of 'strcmp' makes pointer from integer without cast
warning: passing argument 2 of 'strcmp' makes pointer from integer without cast
我知道这可能是因为我在比较非字符串元素,但我将如何转换它们然后比较它们?
执行时我得到:
Segmentation fault(core dumped)
有人可以帮忙吗?
最佳答案
除了说它是“错误的”之外,还没有人解释为什么您所做的是不正确的。
C 中的字符串只是内存中的一串连续字符,其中字符串中的最后一个字符的值为零。您可以将字符串存储在 char
数组中,或者您可以使用 char
指针 (char*
) 指向内存中的某处。
当您输入十进制数时,您正在读取恰好在 '0'
到 '9'
范围内的单个字符,可能以可选的前缀'-'
。您将它们作为字符串读取,如果您想将它们视为整数,则需要将它们转换为整数数据类型(而不是一系列 char
值)。
这就是 atoi
之类的东西有用的地方,尽管它不再流行了。您应该使用 strtol
。 [有一整套函数用于处理 unsigned
、long long
或其组合,以及 double
和 float
类型].
这大约解决了您问题的一半。现在,您正在使用 strcmp
并期望它能正常工作。你正在做的事情有几个问题。主要错误是您不能将整数视为字符串。如果你真的想使用字符串比较,你必须将整数转换为字符串。这意味着您执行的操作与 strtol
执行的操作相反。
这是一个更大的讨论,在您的情况下,这不是正确的方法,因此我不会深入讨论。但我想指出的是,在所有条件相同的情况下,您向 strcmp
发送了错误的类型。它需要两个 char*
指针(实际上是 const char *
)。您所做的是将您的 input
指针取消引用到第一个元素的 char
,然后为第二个元素传递一个 int
。
strcmp(*input,i[0])
指针基本上只是一个数字。它给出了一些数据的内存地址。在这种情况下,数据应为 char
类型(单字节)。 strcmp
函数需要有效的内存地址(实际上在您的堆栈或堆中的东西)。但是你给它的是 *input
(输入字符串中第一个字符的值)和 i[0]
(数字 1
).
那些编译器警告告诉你一些非常重要的事情,你知道的! =)
因此,为了完整起见(尽管其他人已经回答了这个问题),您应该忘记字符串比较(并记下要了解更多有关 C 中的字符串的信息),然后执行此操作:
int value = strtol( input, NULL, 10 );
if( value == i[0] )
printf("1 chosen");
if( value == i[1] )
printf("2 chosen");
还有其他方法可以解决这个问题。我可以谈论如何从字符串转换一位数字,但我想我已经咆哮了足够长的时间。希望对您有所帮助。
关于将输入字符与 C 中的整数数组进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15568657/