0

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

有人可以帮忙吗?

4

7 回答 7

2

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

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

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

这就是类似的东西有atoi帮助的地方,尽管它不再流行。你应该使用strtol. unsigned[处理,long long或它们的组合,以及doublefloat类型,有一整套函数]。

这解决了大约一半的问题。现在,您正在使用strcmp并期望它能够正常工作。你正在做的事情有几件事是错误的。主要错误是您不能将整数视为字符串。如果你真的想使用字符串比较,你必须将整数转换为字符串。这意味着你做了相反的事情strtol

这是一个更大的讨论,在你的情况下,这不是正确的方法,所以我不会进入它。但我想指出,在所有条件相同的情况下,您将错误的类型发送到strcmp. 它需要两个char*指针(const char *真的)。您所做的是取消引用input指向char第一个元素的 a 的指针,然后传递int第二个元素的 a 。

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");

还有其他方法可以解决这个问题。我可以谈论如何从字符串转换个位数,但我想我已经咆哮了足够长的时间了。希望这个对你有帮助。

于 2013-03-22T11:36:32.777 回答
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;

}
于 2013-03-22T11:08:34.827 回答
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

于 2013-03-22T11:12:06.650 回答
0

您需要将输入字符串与一些已知字符串进行比较。但是您正在比较第一个字符与一些整数。 strcmp()如果您将正确的参数传递给它,它将做您需要的事情:两个字符串。

于 2013-03-22T11:02:52.700 回答
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");

我没有编译它们,也许我缺少某些东西,但这是一般的想法

于 2013-03-22T11:05:52.433 回答
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");
于 2013-03-22T11:10:43.633 回答
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");
于 2013-03-22T11:14:24.483 回答