问题描述
我正在学习 CS 入门课程 (CS50x),但遇到了一个小问题。
为什么这个 C 代码在只有 #gfortran -c /home/myUser/Fortran/tests/main.f90 -o main.o
gfortran -c main.f90 -o main.o
gfortran -o test main.o /home/myUser/PycharmProjects/GSIE_2D/fortran_scripts/libblas.a /home/myUser/PycharmProjects/GSIE_2D/fortran_scripts/liblapack.a
rm ./main.o
./test
时会产生分段错误?
它应该打印语句。为什么不打印错误?
提前致谢!
argc[1]
解决方法
argc
是一个整数参数,用于跟踪命令行中的参数数量,没有 argc[1]
,如果您提供第二个命令行,可能会有一个 argv[1]
参数,否则尝试从不存在的 argv[x]
中读取相当于 undefined behavior,并且可能是您遇到的分段错误的罪魁祸首。
根据这些信息,您会注意到 while
语句毫无意义,argc
保持不变,因此循环将永远不会执行,或者如果 argc
是无限循环不是 2
(并且程序不会崩溃)。
if-else
也是可疑的,如果字符是数字或不是数字,它总是打印消息并返回。
不管程序的目标是什么,语法正确的代码应该看起来更像这样:
int main(int argc,string argv[])
{
if (argc == 2)
{
string key = argv[1];
int finalKey = atoi(key) % 26; //*
for (int i = 0; i < strlen(key); i++)
{
if (!isdigit(key[i]))
{
printf("Usage: ./caesar key\n");
return 1;
}
}
}
else
{
puts("Wrong number of arguments,usage: ./caesar key\n");
}
}
* 请注意,atoi
非常不安全,请考虑使用 strtol
。而且你可以直接在argv[1]
i.e. int finalKey = atoi(argv[1]) % 26;
我想你对argc
和argv
的操作不是很清楚。 argc
表示传递给主函数的参数个数。至少它会收到一个参数(argv[0]
,它将是编译后的 C 代码的名称)。此外,它将接收您通过命令行传递的所有参数。
总而言之,正确的做法是:
if (argc >=2){
string key = argv[1];
}
否则,当您尝试访问 segmentation fault
值时,您将获得一个 argv[1]
。