strcmp() 的分段错误

2024-01-31

if(strcmp(argv[2], NULL) == 0)

我传递了 3 个命令行参数,但我也想通过上述语句仅使用 2 个命令行参数来运行它。但正在显示分段错误错误。

我也尝试过

if(argc < 3)

但它也不起作用...同样的分段错误...


为什么分段错误?

因为代码if(strcmp(argv[2], NULL) == 0),您将 NULL 作为字符串指针传递给strcmp()功能;尝试在 NULL 处取消引用来比较字符代码(例如 ascii 代码),这会导致运行时出现未定义的行为。

您应该使用以下命令将字符串指针与 NULL 进行比较== as if(argv[2] == NULL)

我传递了 3 个命令行参数,但我也想通过上述语句仅使用 2 个命令行参数来运行它。

您可以通过两种方式实现此目的:

  1. 主要语法是:

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

    第一个论点argc参数计数器是传递给进程的参数总数,包括进程名称。

    所以当你没有传递额外的参数时argc == 1 e.g. ./exe

    假设您传递三个参数,如下所示:

    ./exe firstname lastname    
    

    Then argc == 3, 看起来您正在传递两个参数,但包括可执行文件名称,您实际上正在传递三个参数来处理。

    所以你可以使用argc在循环中迭代以打印传递的参数的值(除可执行文件外)

     printf("Process name is: %s", argv[0]);
     for(i = 1; i < argc; i++ ){
          printf("argv[%d] %s\n", argv[i]);
     }
    
  2. 第二种技术是使用第二个参数:argv[]是 NULL 终止的字符串数组,所以argv[argc]始终等于 NULL。您可以在循环中使用此信息来迭代和处理传递的参数。

    要理解这一点,假设您正在执行以下函数:

    ./exe firstname lastname    
    

    then argv[0] == ./exe, argv[1] == firstname and argv[2] == lastname and argv[3] == NULL,这次注意argc == 3 (argv[argc] means argv[3]== 空)。

    例如,要打印所有参数,您可以编写如下代码:

      int i = 1;
      printf("Process name is: %s", argv[0]);
      while(argv[i]){// terminates when argv[i] == NULL
        printf("argv[%d] %s\n", argv[i]);   
        i++;
      }
    

你注意到了吗argv[0]始终是您的可执行文件名称!这意味着每当您需要打印可执行文件名称时,请使用argv[0]而不是在编写代码时可执行文件的硬代码名称,这样如果您重新编译并为可执行文件指定新名称,那么argv[0]始终打印正确的名称。您应该编写如下代码:

int main(int argc, char* argv[]){
  :
  :// some other code
  if(argc < min_number_of_arguments){
      fprintf(stderr, "Error: wrong number of arguments passed!\n");
      fprintf(stderr, "Usage: %s [first] [second] \n", argv[0]);
      exit(EXIT_FAILURE);
  }
  :
  :// some other code 
   return EXIT_SUCCESS;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

strcmp() 的分段错误 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 在C语言中使用“void”

    我很困惑为什么我们需要通过void转换为 C 函数 int f void return 0 versus int f return 0 什么是正确的做法以及为什么 In C int f 是一种老式的声明 它说f需要固定但未指定数量和类型的参
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 我在在线程序挑战编译器中遇到演示错误

    include

随机推荐

  • 如何在第二个连接表中进行多个条件的连接?

    我有2张桌子 第一个表是客户列表 第二个表是这些客户拥有的设备列表 另一个字段包含该客户的一些数据 客户问题 问题是对于每个客户来说 可能存在多个问题 我需要对这些表进行联接 但只返回有其中两个问题的客户的结果 问题是 如果我使用 OR 进
  • iText PDFWriter - 如果少数表格行转到新页面,则写入表格标题

    我在用PdfWriter创建 PDF 文档 我正在添加一个PdfPTable到 PDF 文档 该表有标题行 然后是实际数据行 如果表很大 那么它的一部分将被转移到新页面 我希望此页面也有表格标题行 但是 只有当表数据进入新页面时 我才需要此
  • 将带有日期列的 pyspark DataFrame 转换为 Pandas 会导致 AttributeError

    我有以下数据框 pyspark DATE date nullable true ID string nullable true A double nullable true B double nullable true 在尝试将数据帧转换为
  • 如何使用 Google Apps 脚本在 Gmail 插件中创建此 UI

    有人可以告诉我如何使用 Google Apps 脚本在 Gmail 插件中实现以下 UI 我尝试了 KeyValue 的带有可点击文本的图标我能够实现这一点 但我不知道如何将电子邮件文本放在 keyValue 图标旁边 现在 我不关心带有计
  • fopen 在 Linux 中失败,但在 Windows 中工作

    当我运行下面的代码时 它在 Linux 中失败 但在 Windows 中没有问题 文件名类似于 src 文件夹 文件 char loadProgSource const char filename size t finalLength ch
  • 你会如何用冰糕来记忆玫瑰花?

    尝试注释此代码 玫瑰记忆 给我一个错误Use of undeclared variable git sha typed strict frozen string literal true module Util extend T Sig s
  • 将ArrayList转换为有序集(TreeSet)并返回

    我是一种采用数字列表的方法 例如ArrayList 并将其转换为排序集 例如TreeSet 并返回它 我写了代码 但遇到了一些问题 public TreeSet getSort ArrayList list TreeSet set new
  • 来自 HTTPS URLSession.dataTask 的 0 字节数据

    我正在尝试从 URL 检索一些 JSON 数据 但它每次在数据中返回 0 字节 我检查了几个不同的 SO 帖子 但似乎没有一个与我遇到的确切问题相符 因为我从中获取数据的服务器确实使用带有 TLS 1 2 的 HTTPS 所以我不认为有任何
  • 边框位于文本下方但不穿过文本

    我正在为我的杂志做网页设计 现在 我正在尝试制作类似于 1996 年标题的内容 如下图所示 文本下方有边框 但文本周围有白色背景 任何人都可以帮助我做到这一点吗 当然可以 试试这个 HTML div class heading h1 Hea
  • DAX 相当于 Excel PERCENTRANK.INC 每个类别

    我想在 DAX 中计算 Excel 函数 PERCENTRANK INC 的等效项 但按类别计算 我承认我什至不知道如何计算类别 任何提示将不胜感激 以下是示例数据的 M 代码 let Source Table FromRows Json
  • 如何禁用非员工用户的可浏览 API (is_staff=False)?

    就我而言 我使用 Django REST Framework DRF 作为内部 api 它不适合普通用户使用 因此我想为普通用户禁用它 an admin is staff True should be able to access it a
  • ALM 12:通过 REST 进行身份验证返回 400 错误请求

    我遵循这里的指导 http alm help saas hp com en 12 50 api refs REST TECH PREVIEW Content General Session Management html http alm
  • 如何知道以下代码将创建多少个对象?

    当涉及到字符串时 我对对象的情况感到有点困惑 所以想知道使用以下代码将创建多少个对象 以及有关字符串池和堆的字符串对象创建的一些解释 public static void main String args String str1 Strin
  • D3D11坐标系

    我的一些旧代码最终出现了一堆令人讨厌的黑客行为 以使事情 正确 工作 在移动物体和相机方面 例如必须采用 std sin yaw 而不是 std sin yaw 在实现在线其他地方找到的方程时 通常会让一切变得混乱 在许多情况下都达到了追踪
  • iOS 9 UITableView 分隔符插入(显着左边距)

    我的分隔符有问题UITableViewCells in UITableView on iOS 9 他们有很大的左边距 我已经有用于删除间距的代码iOS 8但它不适用于iOS 9 看起来他们还添加了其他东西 我想它可能与布局边距指南 http
  • 找不到表“cdc.lsn_time_mapping”

    我正在开发一个调用此函数 sys fn cdc map time to lsn 的遗留系统 并且出现以下错误 Invalid object name cdc lsn time mapping 我在对象资源管理器中找不到此表 这个功能有替代品
  • 在句子边界分割文本文件

    我必须处理一个文本文件 一本电子书 我想对其进行处理 以便每行有一个句子 换行符分隔的文件 是吗 我如何使用 UNIX 实用程序 sed 来完成此任务 它是否有一个 句子边界 的符号 就像 单词边界 的符号一样 我认为 GNU 版本有这个
  • 让C代码自动绘制图表

    我编写了一个程序 它将数据列表写入 dat 文件 然后使用 gnuplot 单独绘制它 有没有办法让我的代码自动绘制它 我的输出的形式如下 x coord analytic approximation x coord analytic ap
  • Android - 将 TXT 文件作为电子邮件附件发送失败(“无法发送附件”)

    我试图让我的 Android 应用程序发送一封带有附件的电子邮件 并且我从 txt 文件开始 因为这些很简单 到目前为止 我有这个 发生在片段内 Send the email Intent mailIntent new Intent Int
  • strcmp() 的分段错误

    if strcmp argv 2 NULL 0 我传递了 3 个命令行参数 但我也想通过上述语句仅使用 2 个命令行参数来运行它 但正在显示分段错误错误 我也尝试过 if argc lt 3 但它也不起作用 同样的分段错误 为什么分段错误