Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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代码中使用cs.50.h中的'string'的分段错误_C_Segmentation Fault_Cs50_Caesar Cipher - Fatal编程技术网

C代码中使用cs.50.h中的'string'的分段错误

C代码中使用cs.50.h中的'string'的分段错误,c,segmentation-fault,cs50,caesar-cipher,C,Segmentation Fault,Cs50,Caesar Cipher,我这里有一个程序,我试图用ceasar密码解码一串字母;基本上,我将字符串中的每个字符“向下”移动一个字母(“a”->“b”,“f”->“g”,“z”->“a”) 我将一封信向下移动的量取决于我给它的键 在这个特定的程序中,我在main()函数中硬编码了一条秘密编码消息,并在每个可能的密钥中迭代了一个for循环 这个想法是,如果这个秘密信息简单地向下移动x个字母,吐出25个版本的密码将揭示出一个可理解的答案 不幸的是,我在一个程序中使用了一些新概念——argc、argv和多个函数。我对这个很陌生

我这里有一个程序,我试图用ceasar密码解码一串字母;基本上,我将字符串中的每个字符“向下”移动一个字母(“a”->“b”,“f”->“g”,“z”->“a”)

我将一封信向下移动的量取决于我给它的键

在这个特定的程序中,我在main()函数中硬编码了一条秘密编码消息,并在每个可能的密钥中迭代了一个for循环

这个想法是,如果这个秘密信息简单地向下移动x个字母,吐出25个版本的密码将揭示出一个可理解的答案

不幸的是,我在一个程序中使用了一些新概念——argc、argv和多个函数。我对这个很陌生

有人能帮我解释一下我遇到的分割错误吗?我不认为我在争论中造成了任何溢出

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

string decode(int key, string message);

int main(void)
{
    string secret_message = "ueuag rKJ AGIQ GIAR FEgN";

    for (int i = 0; i < 25; i++)
    {
        decode(i, secret_message);
        printf("%s", secret_message);
    }

    return 0;
}

string decode(int key, string message)
{
    int i;

    for (i = 0; i < strlen(message); i++)
    {
        if (message[i] >= 'a' && message[i] <= 'z')
        {
            message[i] = ((message[i] - 97 + key) % 26) + 97;
        }
        else if (message[i] >= 'A' && message[i] <= 'Z')
        {
            message[i] = ((message[i] - 65 + key) % 26) + 65;
        }
    }

    return message;
}
#包括
#包括
#包括
字符串解码(int键、字符串消息);
内部主(空)
{
字符串secret_message=“ueuag rKJ AGIQ GIAR FEgN”;
对于(int i=0;i<25;i++)
{
解码(i,秘密消息);
printf(“%s”,秘密消息);
}
返回0;
}
字符串解码(整数键,字符串消息)
{
int i;
对于(i=0;i如果(message[i]>='a'&&message[i]='a'&&message[i]为什么
string
输入是个坏主意?这里您可以看到一个示例。您正在修改一个字符串文本,但不应该修改。这样做会调用未定义的行为。您应该将字符串视为它们所在的类型,而不是
string
类型

而是这样做

char secret_message[] = "ueuag rKJ AGIQ GIAR FEgN";
以及解码功能

char *decode(int key, char *message)
{
    int i;

    for (i = 0; message[i] != '\0'; i++)
    {
        if (message[i] >= 'a' && message[i] <= 'z')
        {
            message[i] = ((message[i] - 97 + key) % 26) + 97;
        }
        else if (message[i] >= 'A' && message[i] <= 'Z')
        {
            message[i] = ((message[i] - 65 + key) % 26) + 65;
        }
    }

    return message;
}
声明指向字符串文字的指针时,应使用
const char*
,以避免意外尝试修改它


另外,
typedef
ing指针在我看来没有任何好处,并且会引起很多混乱,指针是指针,在声明时必须在其标识符附近有一个
*
,如果你不需要
*
,你很容易忽略代码中的指针而感到困惑。

不知道它的定义,我猜passing
string
直接到
printf
不好。什么是
string
??它在哪里声明?为了避免与
std::string
不必要的混淆,我将删除[C++]这不是C++ C++,它看起来像 String 是计算机科学的一个流行图书馆,它是 char */COD>的一个Type。哇……当教人们C时,这是个很坏的主意。tag不应该出现在这里。感谢您提供的信息性评论。我已将所有内容更改为,并拥有相同的内容problem@DavidManess请在我更新答案时继续阅读,请参阅我的建议->“您不能覆盖字符串文字”@davidmanes将
string
更改为
char*
不会有帮助,因为
string
已经是
char*
的类型定义。您需要将
secret\u消息声明为
char[]
,而不是
char*
(或
string
),那么程序就可以运行了。@Paul如果添加到您的注释中,您可以用字符串文字初始化数组,它将创建一个字符串文字的副本,您可以实际修改它。@Paul谢谢,这很有效。iharob感谢您的时间和解释。
string string_literal = "Do not attempt to modify me, it's undefined behavior";