c - C编程中的分段错误错误
问题描述
当我刚刚运行 ./caesar 命令时,我在这个程序中遇到了分段错误错误。我发现当我写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");
}
}
}
解决方案
您的第一次尝试:
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
.....
}
您已经确定,您有两个参数。因为,如果没有,您的代码就会退出。问题是,您没有使用相同的测试用例测试您的代码版本:您的既和新代码(带有 if 和不带)将使用两个参数;但是,如果只有一个参数,旧的会失败,而第二个不会(它只会从程序返回)。
推荐阅读
- java - 如何根据输入创建不同的spring bean
- java - @InjectMocks 类中的异常的 Junit 测试
- javascript - 事件处理程序可以在事件之间传播吗
- python-3.x - 云视频智能 API 错误 400 和 504
- tensorflow - Windows 致命异常:尝试使用 model_main.py 进行训练时发生访问冲突
- python - 如何将一系列矩阵相乘?
- java - 我无法让我的输出读取 NumberOfTopings,我认为是因为它是一个 int。我真的不知道如何正确格式化字符串以获取 int
- sql - 如何对列中的数据取平均值以创建新变量
- xamarin.forms - 如何在 About 页面中显示 Tabbar
- python - 从数组的特定部分获取元素