我正在尝试将命令行参数转换为变量(第17行,“键”)。当我运行程序时,除了命令行中的名称外,没有其他任何内容
(例如$ ./caesar
),我没有收到任何错误,但是代码没有经过下面显示的行。但是,当我使用任何命令行参数(例如$ ./caesar 2
)运行程序时,该代码会给出错误,如下所示。
我必须使用argv
作为密钥,因为这是此分配的要求(如果有帮助,我正在对CS50进行此操作)。我不知道argv
的运作情况如何,对其进行研究并没有帮助我。因此,我在调试方面没有做很多尝试。链接到cs50库:https://cs50.readthedocs.io/library/c/
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[]){
if (argc != 2){ //limits args code will accept to one
return 1;
}
if (isdigit(argv[1]) == true){ //checks if first arg is digit
printf("Usage: ./caesar key\n");
return 1;
} else {
printf("Success\n");
}
int key = atoi(argv[1]); // converting first arg to int
这是我使用任何命令行arg以及编译程序时遇到的错误。
$ make caesar
clang -fsanitize=signed-integer-overflow -fsanitize=undefined -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow caesar.c -lcrypt -lcs50 -lm -o caesar
$ ./caesar 2
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==1070==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x7f259d8849b2 (pc 0x0000004281c1 bp 0x7fff67ba6ad0 sp 0x7fff67ba68f0 T1070)
==1070==The signal is caused by a READ memory access.
#0 0x4281c0 in main /root/sandbox/caesar.c:10:9
#1 0x7f24cdfb6b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
#2 0x402b89 in _start (/root/sandbox/caesar+0x402b89)
UndefinedBehaviorSanitizer can not provide additional info.
==1070==ABORTING
答案 0 :(得分:1)
sscanf
可用于从argv [1]扫描整数。
sscanf
将返回成功扫描的项目数。
#include <stdio.h>
int main ( int argc, char *argv[]) {
int key = 0;
if (argc != 2){ //limits args code will accept to one
printf("Usage: ./%s key\n", argv[0]);
return 1;
}
if ( 1 != ( sscanf ( argv[1], "%d", &key))) { //try to scan an int
printf("Usage: ./%s key\n", argv[0]);
return 1;
} else {
printf("Success\n");
}
return 0;
}
@NeilEdelman
建议将代码压缩为
#include <stdio.h>
int main ( int argc, char *argv[]) {
int key = 0;
if ( argc != 2 || 1 != ( sscanf ( argv[1], "%d", &key))) { //try to scan an int
printf("Usage: ./%s key\n", argv[0]);
return 1;
} else {
printf("Success\n");
}
return 0;
}
答案 1 :(得分:-1)
正如其他人所说,您不能以这种方式使用isdigit()
,因为它已经期望有整数。其中,您的参数未从控制台作为整数读取。如果要使用命令行参数而不是scanf()
,只需查找/编写一个函数即可将字符串转换为等效的整数表示形式。从谷歌的快速搜索中,我可以看到关于如何在C语言中将字符串转换为整数的问题已经问了很多遍,并且有很多答案。