c - 由于缺少命令行参数 (argv[1]) 导致的分段错误
问题描述
这段代码用于检查用户是否只输入了一个数字命令行参数,如果不是这样,则返回错误代码“1”。我设置了代码,以便它首先检查 argc 是否不是 2。不幸的是,如果没有输入命令行参数,我仍然会收到分段错误,而且我不确定为什么这段代码没有捕获 null命令行参数的数量。
我尝试将“if (argc !=2)”公式移到整个“for”语句上方,以尝试从一开始就捕获命令行参数问题,但我收到了相同的结果。
我的问题是,为什么在没有提供命令行参数的情况下会收到分段错误,而我缺少什么来确保程序在没有命令行参数的情况下不会出现分段错误?
由于课程政策,我将只提供有问题的代码段。
#include <unistd.h>
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
// add'l variables //
int k = atoi(argv[1]);
for (int i = 0; i < strlen(argv[1]); i++)
{
if (argc != 2)
{
printf("Please enter only 1 command-line argument.\n");
return 1;
}
else if (!isdigit(argv[1][i]))
{
printf("Usage: ./caesar key\n");
return 1;
}
}
// add'l code //
解决方案
argc
在使用 之前必须先检查argv[1]
,因为argv[1]
if 可能没有有效的指针argc < 2
。您的代码的更正版本可能是这样的:
#include <stdio.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
int i = 0;
if (argc != 2) {
printf("Please enter only 1 command-line argument.\n");
return 1;
}
while (isdigit(argv[1][i]))
++i;
if (argv[1][i] != '\0') {
printf("Usage: ./caesar key\n");
return 1;
}
return 0;
}
推荐阅读
- asp.net - ASP.NET MVC 中的 post 数据中的响应数据为空
- python - 我不知道为什么我一直得到 12 < 3
- discord.py - Discord bot:检查消息内容是否为 int
- python - ValueError ResNet Keras
- excel - Excel VB函数太多时间
- python - 无法在 Python 中处理 Chrome 通知
- java - 如何创建带有参数的工厂方法?
- python-3.x - 计算每小时时间范围的情绪指数
- javascript - JavaScript 结果未显示在 PhoneGap 中
- android - Android LiveData 和 Room:getValue 返回 NULL