我是C的初学者。我有一个简单的程序,我希望将每个关键字更改为相应的数字。例如A = 0,B = 1和F = 5等。在这种情况下,关键字" hello"将是" 7 4 11 11 14"。 我可以编译这段代码,但每当我运行它时,我都会收到错误" Segmentation fault(core dumped)"。我尝试了几件事来改变它,但没有用。有人可以检查我的代码并给我反馈吗?我对样式,逻辑和其他代码相关内容的任何建设性反馈也是受欢迎的!
#include <cs50.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(int argc, string argv[])
{
int keylength = strlen(argv[1]);
char *key = argv[1];
// insert keyword
if (argc != 2)
{
printf("Less commands please.");
return 1;
}
else
{
if (!isalpha(argv[1]))
{
printf("Please no numbers or weird symbols");
}
else
{
for (int i = 0; i < keylength; i++)
{
if(isupper(key[i]))
{
key[i] = key[i] - 65;
}
else if(islower(key[i]))
{
key[i] = key[i] - 97;
}
}
}
}
}
答案 0 :(得分:0)
isalpha
接受一个字符作为输入,而不是指向字符的指针(或字符串,就像你所做的那样)。您需要遍历字符串并单独检查每个字符。我不确定这是否会导致段错误...
另一个可能的问题:运行程序时,是否使用参数运行它?
如果没有,那么int keylength = strlen(argv[1]);
将导致段错误,因为argv[1]
不存在。在检查参数数量之后,你应该把它放在else
子句中。
答案 1 :(得分:0)
你可以这样做
#include <ctype.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
if (argc != 2)
{
printf("Must provide one argument\n");
return 1;
}
int keylength = strlen(argv[1]);
int i = 0;
for( ; i <keylength; i++)
{
if (!isalpha(argv[1][i]))
{
printf("not alpha\n");
return 1;
}
}
char *key = argv[1];
printf("b4 %s\n", argv[1]);
for (int i = 0; i < keylength; i++)
{
if(isupper(key[i]))
key[i] = key[i] - 65;
else if(islower(key[i]))
key[i] = key[i] - 97;
}
printf("after %s\n", argv[1]);
}
注意事项。
argv[1]
至少为2之前,请勿尝试访问argc
。argv[1]
检查isalpha
中的每个字符。不只是将字符串指针直接传递给isalpha
。argv[1]
并改变它。我没有在我的例子中实现这个。