- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
if(strcmp(argv[2], NULL) == 0)
我正在传递 3 个命令行参数,但我也想通过上述语句仅使用 2 个命令行参数来运行它。但是正在显示段错误。
我也试过
if(argc < 3)
但它也没有用...同样的段错误...
最佳答案
Why segmentation fault?
由于代码 if(strcmp(argv[2], NULL) == 0)
,您将 NULL 作为字符串指针传递给 strcmp()
函数;尝试在 NULL 处进行引用以比较字符代码(例如 acsii 代码),这会在运行时导致未定义的行为。
您应该使用 ==
作为 if(argv[2] == NULL)
I'm passing 3 command line arguments but I also want to run it with only 2 command line arguments with the above statement.
您可以通过两种方式实现:
主要语法是:
int main(int argc, char* argv[])
第一个参数 argc
是参数计数器,它是传递给您的进程的参数总数,包括进程名称。
所以当你没有传递额外的参数时 argc == 1
例如./exe
假设你传递三个参数如下:
./exe firstname lastname
然后argc == 3
,看起来您正在传递两个参数,但包括可执行文件名称,您实际上是在将三个参数传递给进程。
因此您可以使用 argc
值在循环中迭代以打印传递的参数(除了可执行文件)
printf("Process name is: %s", argv[0]);
for(i = 1; i < argc; i++ ){
printf("argv[%d] %s\n", argv[i]);
}
第二种技术是使用第二个参数:argv[]
是 NULL 终止的字符串数组,因此 argv[argc]
始终等于 NULL。您可以在循环中使用此信息来迭代和处理传递的参数。
要理解这一点,假设您正在执行函数:
./exe firstname lastname
然后 argv[0] == ./exe
,argv[1] == firstname
和 argv[2] == lastname
和argv[3] == NULL
,注意这次argc == 3
(argv[argc]
表示argv[3]
== NULL)。
例如要打印所有参数,您可以编写如下代码:
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;
}
关于c - strcmp() 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19108368/
我想知道如果在同一个函数中多次使用 strcmp() 会返回不同的值。下面是程序。第一种情况我知道它为什么打印 -6。但是在第二种情况下,为什么会打印-1呢? #include #include in
所以我们在 PHP 中得到了这个函数 strcmp(string $1,string $2) // returns -1,0, or 1; 然而,我们没有 intcmp();所以我创建了一个: fun
我正在比较用户输入的用户名和密码。正在比较的字符串正在从文件中读入。无论出于何种原因,它都会适当地比较用户名,而不是密码。。控制台输出:
我正在比较用户输入的用户名和密码。正在比较的字符串正在从文件中读入。无论出于何种原因,它都会适当地比较用户名,而不是密码。。控制台输出:
虽然 word 和 s2 相同,但是 if(strcmp) 语句没有被执行。错在哪里??我检查了从文件中读取的代码并尝试了“printf”以查看 word 和 s2 是否相同,发现它们在大约 10 次
是不是只有静态存储类型的变量不会被函数的返回值初始化,因为它们不被认为是常量?根据这个论点,以下声明在 C 中是否有效。它编译时没有错误或警告, 并且输出符合预期。 #include #includ
我必须生成一个反向链表,这些是我的先决条件 定义结构: struct node { int data; struct node * link; } 包含函数 append --- 在链
我是 C 编程的新手。我正在尝试比较两个字符串。我收到错误:此行有多个标记。传递 'strcmp' 的参数 1 使指针来自整数而不进行强制转换。传递 'strcmp' 的参数 2 使指针来自整数而不进
请注意,我已经检查了与此标题相关的问题,但从我的角度来看,它们与此问题无关。 最初我以为 program1 和 program2 会给我相同的结果。 //Program 1 char *a = "ab
你好,我正在使用 fgets 对我的代码进行循环,我希望当用户引入单词 "bye" 时程序结束,所以我有一个像这样的时间: char buf[1000] do{ fgets(buf, 1000
我想了解为什么我的代码会崩溃。我有一个结构数组,如下所示: typedef struct contact { char cFirstName[10]; char cLastName[1
代码: #include #include #include int main() { int n = strcmp("hello","help"); printf("%d\
这个问题在这里已经有了答案: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized po
该程序执行以下操作: 扫描文本字符串char input[15]; 将其与字符密码[ ] = "1sure";进行比较 如果字符串不匹配则循环。 如果字符串匹配则终止。 当字符串不匹配时程序会循环。但
我正在读一本 C 语言的书,并且看过这两个 strcmp 算法。 我已经了解了 for 循环的使用原理。 但这两个for循环对我来说是新的。我不明白这些部分 for (i = 0; s[i] == t
用 gcc C99 编译 我正在尝试使用字符串比较来比较 2 个字符串。但是,我似乎在 strcmp 行上得到了堆栈转储。 **属性将包含这些,所以我正在寻找框架类型。 [name] [time] [
我正在努力填补计算机科学方面的自学空白,并参加 Edx 上的 CS50 类(class)。我对 C 完全陌生。在其中一个问题集中,我必须比较使用 crypt 函数加密的字符串。 在下面的示例中,我无法
谁能解释一下 strcmp 在 C 编程中使用什么算法来比较两个字符串? 我不明白它的返回值,它使用任何算法,如“Levenstien 算法”来找出两个字符串之间的距离... 最佳答案 标准 C 库
我在结构数组 books 上有一个delete 函数。我向它传递了一组记录、书的作者 和书名 以及列表大小。 现在这里 假设 list[0].author 和 list[5].author 和 aut
这个问题已经有答案了: using fgets and strcmp in C [duplicate] (3 个回答) 已关闭 4 年前。 作为初学者,我一直在尝试该库的一些功能 string.h并且
我是一名优秀的程序员,十分优秀!