将输入字符与C中的int数组进行比较

时间:2013-03-22 10:59:56

标签: c

我是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)

有人可以帮忙吗?

7 个答案:

答案 0 :(得分:2)

除了说它是“错误的”之外,还没有人解释为什么你正在做的事情是不正确的。

C中的字符串只是内存中的一堆连续字符,其中字符串中的最后一个字符的值为零。您可以将字符串存储在char数组中,也可以使用char指针(char*)指向内存中的某个位置。

当您输入十进制数字时,您正在读取恰好位于'0''9'范围内的单个字符,可能以可选的'-'作为前缀。您将它们作为字符串读取,如果要将它们视为整数,则需要将它们转换为整数数据类型(而不是一系列char值)。

这就像atoi之类的东西有所帮助,尽管它不再流行。您应该使用strtol。 [这些函数有一整套用于处理unsignedlong long或其组合,以及doublefloat类型。

解决了大约一半的问题。现在,您正在使用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

将输入字符串转换为int
int 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");