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

标签 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)

有人可以帮忙吗?

最佳答案

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

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

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

这就是 atoi 之类的东西有用的地方,尽管它不再流行了。您应该使用 strtol。 [有一整套函数用于处理 unsignedlong 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/

相关文章:

c - 打印包含多个 NUL 的整个字符串

c - 将多种类型的值传递给函数

c - 为什么编译器生成的代码会一遍又一遍地在同一内存位置写入相同的内容?

C2100 错误 : Illegal Indirection

c - 使用 C 修改从索引开始的数组内容

c - 进程在 "Disk Sleep"时线程还在运行吗?

c - 父局部变量充当三个 child 之间的共享变量

c - 天真的梯形逻辑比因式逻辑更好吗?

linux - 在用户模式下获取进程的时间片

c - 是否有 C 函数来获取文件的权限?