c - CS50 PSET-2 凯撒分段错误
问题描述
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h> //covert str into int atoi()
#include <ctype.h> // isalpha(), isdigit() etc.
#include <string.h> //strlen() etc.
int main(int argc, string argv[])
{
// convert argv[1] into int
int key = atoi(argv[1]);
// if input is 2 command lines and argv > 0 and there is no alphabet n shit in argv[1] we good to go
if (argc == 2 && key > 0 && isdigit(argv[1]))
{
//ask for input to chiper
string plain = get_string("Plaintext: ");
int len_plain = strlen(plain);
// check each char in string plain
for (int i = 0; i < len_plain; i++)
{
// if its from 'a' to 'z' add number of key
if (plain[i] >= 'a' && plain[i] <= 'z')
{
char cipher = (plain[i] + key) % 26;
printf("%c", cipher);
return 0;
}
}
}
else
{
printf("Usage: ./caesar kay");
return 1;
}
}
运行此代码时,我遇到了分段错误。我做错了什么?我已经在这段代码上工作了几天,但我无法让它工作。
解决方案
这isdigit(argv[1])
是一个段错误。isdigit
(来自手册页)的函数签名:
int isdigit(int c);
但是,argv[1]
(如果它存在!)是一个字符串。建议您遵循规范
- 验证输入了正确数量的命令行参数
- 检查所述参数中的每个字符是十进制数字
只有这样,您才能放心,atoi
会给出预期的结果。
推荐阅读
- sql - 聚合更新
- java - 从 Cloud Firestore 获取地图数据
- xamarin.forms - 如何使用 xamarin ios 在 instagram 中共享文本和链接?
- python - AWS S3:从 ec2 到 s3 的大文件上传失败
- python - 自然语言处理中多列的预测值
- pandas - 在 numpy 数组中应用自定义函数
- r - 如何在R中不可见地输出部分输出
- visual-studio - 如何在 Visual Studio 2019 中创建 xamarin PCL 项目
- c# - 如何从 **1&1 Ionos** 托管服务器中托管的 ASP.NET Core 2.2 连接 MS SQL Server 数据库?
- android - 有什么方法可以正确显示 FAB 按钮?