我是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)
有人可以帮忙吗?
答案 0 :(得分:2)
除了说它是“错误的”之外,还没有人解释为什么你正在做的事情是不正确的。
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");
还有其他方法可以解决这个问题。我可以谈谈如何从字符串中转换单位数字,但我想我已经跑了足够长的时间。希望这有一些帮助。
答案 1 :(得分:1)
除了作为你的qn的答案列出的各种方法。
为什么不将用户输入视为int ??
#include<stdio.h>
int main()
{
int i[2] = {1,2};
int input;
printf("Select option:");
scanf("%d",&input);
if(input==i[0])
printf("1 chosen");
if(input==i[1])
printf("2 chosen");
return 0;
}
答案 2 :(得分:1)
您必须使用scanf而不是fgets:
int input;
printf("Select option:");
scanf("%d", &input);
if (input == i[0])
等等。
请参阅http://en.wikibooks.org/wiki/C_Programming/Simple_input_and_output#Input_using_scanf.28.29
答案 3 :(得分:0)
您需要比较输入字符串与某些已知字符串。但是你要比较第一个字符和一些字符。如果你传递正确的参数,strcmp()
会做你需要的:两个字符串。
答案 4 :(得分:0)
这里你试图使用strcmp将字符串与整数进行比较:
if(strcmp(*input,i[0]) == 0)
无效。
你可以这样做:const char *numbers[2] = {"1", "2"};
char input[3];
printf("Select option:");
fgets(input,3,stdin);
if(strcmp(*input, numbers[0]) == 0)
printf("1 chosen");
if(strcmp(*input, numbers[1]) == 0)
printf("2 chosen");
比较两个字符串,而不是将数字与字符串进行比较
或者您可以使用sscanf或atoi
将输入字符串转换为intint i[2] = {1,2};
char input[3];
int num;
printf("Select option:");
fgets(input,3,stdin);
sscanf(input, "%d", &num);
if(num == i[0])
printf("1 chosen");
else if(num == i[1])
printf("2 chosen");
我没有编译它们,也许是我错过了但是这是一般的想法
答案 5 :(得分:0)
使用atoi
。它会将你的字符串转换为整数
int i[2] = {1,2};
char input[3];
printf("Select option:");
fgets(input,3,stdin);
if(atoi(input)==i[0]))
printf("1 chosen");
if(atoi(input)==i[1]))
printf("2 chosen");
答案 6 :(得分:0)
使用atoi函数更好地将输入char转换为int。
http://www.cplusplus.com/reference/cstdlib/atoi/
int i[2] = {1,2};
char input[3];
int opt=0;
printf("Select option:");
fgets(input,3,stdin);
opt = atoi(input);
if(opt== i[0])
printf("1 chosen");
if(opt == i[1])
printf("2 chosen");