当我只运行./caesar命令时,在此程序中出现 Segmentation Fault错误。我发现在代码开头写 int length = strlen(argv [1]); 时,错误被打印出来,当我将这行代码放在(for循环)之前时,它可以正常工作,但是我不明白为什么它在那里可以正常运行,而不是在程序顶部?
我非常感谢您的帮助!!提前致谢。
int main(int argc,string argv[])
{
int s=0;
int length=strlen(argv[1]); ##GETS ERROR
if ( argc !=2)
{
printf("Usage:./caesar key\n");
return 1;
}
else
{
int length=strlen(argv[1]); ##WORKS FINE
for (int i = 0; i < length ; i += 1)
{
int c= argv[1][i];
if (isdigit(c))
{
s += 1;
}
else
{
s+=0;
}
}
printf("%i\n",s);
if (length==s)
{
int key = atoi(argv[1]);
printf("int:%i\n",key);
}
else
{
printf("Usage:./caesar key\n");
}
}
}
答案 0 :(得分:0)
您的第一次尝试:
int length=strlen(argv[1]); ##GETS ERROR
这会产生错误,因为调用main时只有一个参数:没有索引为1的参数。这种方式是不安全的,因此您应该先处理参数数量,然后解析/读取/使用争论。
第二次尝试时(在其中处理argc):
if (argc !=2)
{
printf("Usage:./caesar key\n");
return 1;
}
else
{
int length=strlen(argv[1]); ##WORKS FINE
.....
}
您已经确定有两个参数。因为,否则,您的代码将退出。问题是,您不会使用相同的测试用例来测试您的代码版本:您的代码和新代码(带有和不带有)都将使用两个参数。但是,如果只有一个参数,旧的将失败,而第二个则不会(仅从程序返回)。
答案 1 :(得分:0)
很可能需要在参数上使用凯撒。不仅要输入“ ./caesar”,还要输入“ caesar blah”。更重要的是,您应该编写一些代码来检查参数的数量。例如,您可能会写类似
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s arg1 arg2 ...\n", argv[0]);
return EXIT_FAILURE;
}
/*
...
Fill in code
...
*/
}
编辑:我觉得这里发生了一些误会。如果放置“ int s = strlen(argv [1]);”在片段“ if(argc!= 2)...”之前,凯撒程序将尝试在不存在的字符串上调用strlen,从而导致seg错误。本质上,总是在执行其他操作之前首先编写错误检查代码(“ if(argc!= 2)...”)。此外,在“ if(argc!= 2)...”之后不需要else。我觉得摆脱else关键字并将主体保留在else子句中是一种更好的样式。