Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分段故障(堆芯转储)-简单_C_Cs50 - Fatal编程技术网

C 分段故障(堆芯转储)-简单

C 分段故障(堆芯转储)-简单,c,cs50,C,Cs50,我是C语言的初学者。我有一个简单的程序,我想把每个关键字都变成一个对应的数字。例如,A=0、B=1和F=5等。在这种情况下,关键字“hello”将是“7 4 11 14”。 我可以编译这段代码,但每当我运行这段代码时,就会出现错误“Segmentation fault(core dumped)”。我尝试了几件事来改变它,但都没有成功。有人能检查我的代码并给我反馈吗?欢迎对我的风格、逻辑和其他与代码相关的东西提出任何建设性的反馈 #include <cs50.h> #include &

我是C语言的初学者。我有一个简单的程序,我想把每个关键字都变成一个对应的数字。例如,A=0、B=1和F=5等。在这种情况下,关键字“hello”将是“7 4 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;
            }
        } 
    }               
}

} 
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符串argv[])
{
int keylength=strlen(argv[1]);
char*key=argv[1];
//插入关键字
如果(argc!=2)
{
printf(“请减少命令”);
返回1;
}
其他的
{
if(!isalpha(argv[1]))
{
printf(“请不要使用数字或奇怪的符号”);
}    
其他的
{
for(int i=0;i
isalpha
接受字符作为输入,而不是像您所做的那样接受指向字符(或字符串)的指针。您需要在字符串中循环并逐个检查每个字符。但我不确定这是否会导致故障

另一个可能的问题是:当你运行程序时,你是在用一个参数运行它吗

如果不是,则
int keylength=strlen(argv[1])argv[1]
不存在,code>将导致SEGVULT。在检查参数的数量后,您应该将其放入
else
子句中。

您可以像这样做

#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]);
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc!=2)
{
printf(“必须提供一个参数\n”);
返回1;
}
int keylength=strlen(argv[1]);
int i=0;

因为(;i
argv[1]
是一个指向
char
的指针,所以我很惊讶编译器没有对你大喊大叫,例如
isalpha(argv[1])
。至于崩溃,在调试器中运行以找到它。哦,在你知道它有效之前取消引用指针很可能会导致(例如:你使用
argv[1]<代码> >之前,检查是否有一个<代码> ARGV(1)< /代码>。什么是<代码>字符串< /C>?定义为(可能是<代码> C550./<代码>中的TyBueF)?作为对你的指导者的FYI,这可能是一个坏名字,用作TyPulf,因为<代码> String 实际上是C++中的关键字,并且可能会引起更多的混乱而不是帮助。(特别是因为它可能是
char*
的typedef;只需使用
char*
,实际上就不会那么混乱了)。谢谢!这真的很有帮助!没问题。如果这是您想要的答案,请随意接受。