argv中更改char值的分段错误

时间:2013-12-29 00:00:26

标签: c runtime-error

我正在尝试将字符串转换为字母数字值,每次尝试显示argv [1]时都会出现Segmentation fault(core dumped)错误...

#include <stdio.h>
#include <string.h>


int main(int argc, char* argv[])
{        
    int key[strlen(argv[1])];
    for (int i=0,n=strlen(argv[1]);i<n;i++)
    {
        // i'm going to assume all command line arguments are alphabetic
        if(argv[1][i]<='Z')
            {argv[1][i]-='A';}
        else
            {argv[1][i]-='a';}

        key[i]=argv[1][i];
    }
    printf("%s",argv[1]);
}

我环顾四周,很多答案说它来自于划分/模数为0,但我根本不这样做。 我已评论和取消评论的东西,我看到没有else语句,它工作正常。如果程序适用于if语句,为什么它会给else语句错误?

1 个答案:

答案 0 :(得分:1)

您的问题是printf - 声明。

这样做:

#include <stdio.h>
#include <string.h>


int main(int argc, char* argv[])
{        
    int key[strlen(argv[1])];
    for (int i=0,n=strlen(argv[1]);i<n;i++)
    {
        // i'm going to assume all command line arguments are alphabetic
        if(argv[1][i]<='Z')
            {argv[1][i]-='A';}
        else
            {argv[1][i]-='a';}

        key[i]=argv[1][i];

        printf("%d ",argv[1][i]);
    }
}

问题是,argv[1]仍然是char*,因此所有值都被解释为字符,而不是整数。这些是不可打印的,因为它们在0到26的范围内。你想逐个输出它们作为整数。

如果输出字符串不再有有效结束,这也可能解释了输入相关的分段错误,但我无法再现它。