分段错误(核心已转储),不知道为什么?
Segmentation fault (core dumped), cant figure why?
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
string cipher = "qwertyuiopasdfghjklzxcvbnm";
string plaintext = "Hello World!";
string ciphertext = "ciphertext: ";
for(int j = 0; j < strlen(plaintext); j++)
{
if(isupper(plaintext[j]))
{
int k = plaintext[j] - 65;
char append = toupper(cipher[k]);
strncat(ciphertext, &append, 1);
}
else if(islower(plaintext[j]))
{
int l = plaintext[j] - 65;
char append2 = tolower(cipher[l]);
strncat(ciphertext, &append2, 1);
}
else
{
char append3 = plaintext[j];
strncat(ciphertext, &append3, 1);
}
}
printf("%s", ciphertext);
}
当 运行 以上错误来自于尝试连接密文并追加。据我所知,尝试写入无效内存位置时出现错误,我不明白这是如何调用无效内存位置的?
您声明了一个指向字符串文字的指针
string ciphertext = "ciphertext: ";
然后您尝试更改字符串文字
strncat(ciphertext, &append, 1);
任何更改字符串文字的尝试都会导致未定义的行为。
您需要分配一个足够大的字符数组来存储连接的字符串,例如
char ciphertext[25] = "ciphertext: ";
也在这个if语句中
else if(islower(plaintext[j]))
{
int l = plaintext[j] - 65;
char append2 = tolower(cipher[l]);
//...
字符串 cipher
中的索引计算不正确。你不应该使用像 65 这样的幻数。至少使用像 'a'
或 'A'
.
这样的字符
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
string cipher = "qwertyuiopasdfghjklzxcvbnm";
string plaintext = "Hello World!";
string ciphertext = "ciphertext: ";
for(int j = 0; j < strlen(plaintext); j++)
{
if(isupper(plaintext[j]))
{
int k = plaintext[j] - 65;
char append = toupper(cipher[k]);
strncat(ciphertext, &append, 1);
}
else if(islower(plaintext[j]))
{
int l = plaintext[j] - 65;
char append2 = tolower(cipher[l]);
strncat(ciphertext, &append2, 1);
}
else
{
char append3 = plaintext[j];
strncat(ciphertext, &append3, 1);
}
}
printf("%s", ciphertext);
}
当 运行 以上错误来自于尝试连接密文并追加。据我所知,尝试写入无效内存位置时出现错误,我不明白这是如何调用无效内存位置的?
您声明了一个指向字符串文字的指针
string ciphertext = "ciphertext: ";
然后您尝试更改字符串文字
strncat(ciphertext, &append, 1);
任何更改字符串文字的尝试都会导致未定义的行为。
您需要分配一个足够大的字符数组来存储连接的字符串,例如
char ciphertext[25] = "ciphertext: ";
也在这个if语句中
else if(islower(plaintext[j]))
{
int l = plaintext[j] - 65;
char append2 = tolower(cipher[l]);
//...
字符串 cipher
中的索引计算不正确。你不应该使用像 65 这样的幻数。至少使用像 'a'
或 'A'
.