C代码中使用cs.50.h中的'string'的分段错误
我这里有一个程序,我试图用ceasar密码解码一串字母;基本上,我将字符串中的每个字符“向下”移动一个字母(“a”->“b”,“f”->“g”,“z”->“a”) 我将一封信向下移动的量取决于我给它的键 在这个特定的程序中,我在main()函数中硬编码了一条秘密编码消息,并在每个可能的密钥中迭代了一个for循环 这个想法是,如果这个秘密信息简单地向下移动x个字母,吐出25个版本的密码将揭示出一个可理解的答案 不幸的是,我在一个程序中使用了一些新概念——argc、argv和多个函数。我对这个很陌生 有人能帮我解释一下我遇到的分割错误吗?我不认为我在争论中造成了任何溢出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和多个函数。我对这个很陌生
#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指针在我看来没有任何好处,并且会引起很多混乱,指针是指针,在声明时必须在其标识符附近有一个*
,如果你不需要*
,你很容易忽略代码中的指针而感到困惑。不知道它的定义,我猜passingstring
直接到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";