【问题标题】:stdlib.h not working as intended with atoi() functionstdlib.h 无法与 atoi() 函数一起正常工作
【发布时间】:2014-05-30 06:11:07
【问题描述】:

在我的程序中,我使用 atoi() 函数从 argv 中提取一个 int。当我使用

#include <stdlib.h>

我收到以下错误:

cachesim.c:20: warning: passing argument 1 of ‘atoi’ from incompatible pointer type

但是,如果我不包含 stdlib.h,我根本不会收到任何错误,并且我的代码可以正常运行。这是为什么呢?

#include <stdlib.h>
#include <stdio.h>

main(int argc, int **argv){

    if(argc == 0){
            int blk = 32;

            int i;
            for (i = 1; i < argc; i++){
                    if (strcmp(argv[i], "-b") == 0){

                            if (i + 1 <= argc - 1)
                                    blk = atoi(argv[i+1]);
                    }

            }
    } }

【问题讨论】:

  • main 的声明应该是:main(int argc, char *argv[]){ - 警告是因为 atoi 采用 char * 而不是 int *... 当您不包含标题时,编译器至少应该发出关于未定义函数 atoi 的警告。
  • 请注意“我收到以下错误:”,后面是 警告 achesim.c:20: warning: passing argument ...?这暗示,如果没有在 include 文件中找到适当的原型,程序可能会编译和运行:运行是否正确。

标签: c


【解决方案1】:

变化:

main(int argc, int **argv){ 

int main(int argc, char *argv[]){

您之前的声明不是main 的可接受声明,atoi 需要char * 类型的参数。

【讨论】:

  • 感谢您的解释。还有一个问题,我还需要传入一个字符。这个实现是否允许这样做?
【解决方案2】:

argv应该是一个字符数组,你必须读取字符然后将它们转换成一个int。

还有,什么是:

if(argc == 0)

如果你没有论据?这根本不可能,因为程序名称是作为参数传递的。

见:

What does int argc, char *argv[] mean?

您也没有在正确的范围内声明 int blk,当您离开 if(argc == 0) 语句时,变量 blk 将消失。

【讨论】:

  • C 规范说“argc 的值应为非负数。”并进一步讨论“如果 argc 的值大于零”。 argc 可以为 0,但在你体验过的平台上可能不是。
  • 确定不是我见过的任何东西,但如果他试图读取参数,那么 argc 应该是非零的。检查参数的数量是否等于 0,然后继续使用参数,这是违反直觉的。
  • 同意“这是违反直觉的......”,但“argc == 0”的“甚至不可能”夸大其词并且不符合 C 规范。
  • 为了清楚起见,argv 不是字符数组。它是指向指针数组(类型为char *)的第一个元素的指针。这些指针又是指向字符数组的指针。我知道这似乎是一个小问题,但考虑到您试图向似乎对argcargv 工作方式感到困惑的人解释argv,似乎适合给出一个精确的描述。
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2017-12-14
  • 2020-08-19
  • 2013-02-06
相关资源
最近更新 更多