分段错误(Core dumped) - 简单

时间:2015-02-17 01:33:06

标签: c cs50

我是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;
            }
        } 
    }               
}

} 

2 个答案:

答案 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]);
}

注意事项。

  1. 在您知道argv[1]至少为2之前,请勿尝试访问argc
  2. 您需要在循环中针对argv[1]检查isalpha中的每个字符。不只是将字符串指针直接传递给isalpha
  3. 另请注意,您正在直接更改命令行参数内存。虽然它可以做,但这是一个可疑的做法。最好复制argv[1]并改变它。我没有在我的例子中实现这个。