Почему в C есть ошибка сегментации? - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь решить эту проблему: https://www.reddit.com/r/dailyprogrammer/comments/ffxabb/20200309_challenge_383_easy_necklace_matching/

, где вы проверяете, можно ли переставить слова, переместив последнюю букву одного в перед (можно сделать несколько раз) и я продолжаю получать ошибку сегментации в строке 37. Кто-нибудь знает почему?

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

void shift(string, int);

bool same_necklace(string a, string b)
{
    if(strlen(a) != strlen(b))
    {
        printf("false\n");
        return false;
    }
    int n = strlen(a);
    for(int i = 0; i < n; i++)
    {
        shift(a, n);
        if(strcmp(a, b) == 0)
        {
            printf("true\n");
            return true;
        }
    }
    printf("false\n");
    return false;
}

void shift(string a, int n)
{
    char output[n];
    for(int i = 0; i < n; i++)
    {
        output[i] = a[(i+1) % n];
    }
    for(int i = 0; i < n; i++)
    {
        a[i] = output[i];
    }
}

int main(void)
{
    same_necklace("nicole", "icolen");
    same_necklace("nicole", "lenico");
    same_necklace("nicole", "coneli");
    same_necklace("aabaaaaabaab", "aabaabaabaaa");
    same_necklace("abc", "cba");
    same_necklace("xxyyy", "xxxyy");
    same_necklace("xyxxz", "xxyxz");
    same_necklace("x", "x");
    same_necklace("x", "xx");
    same_necklace("x", "");
    same_necklace("", "");
}

1 Ответ

0 голосов
/ 16 апреля 2020

Вы пытаетесь сохранить значения в строковом литерале, который в современных ОС доступен только для чтения.

Чтобы исправить это, сделайте копию строки, которую вы собираетесь сдвинуть заранее. Не забудьте освободить место для нулевого терминатора и освободить память после того, как вы закончите:

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

void shift(string, int);

bool same_necklace(string a, string b)
{
    int n = strlen(a);
    a = memcpy(malloc(n + 1), a, n + 1);
    if(strlen(a) != strlen(b))
    {
        printf("false\n");
        return false;
    }
    for(int i = 0; i < n; i++)
    {
        shift(a, n);
        if(strcmp(a, b) == 0)
        {
            printf("true\n");
            return true;
        }
    }
    printf("false\n");
    free(a);
    return false;
}
void shift(string a, int n)
{
    char output[n];
    for(int i = 0; i < n; i++)
    {
        output[i] = a[(i+1) % n];
    }
    for(int i = 0; i < n; i++)
    {
        a[i] = output[i];
    }
}
int main(void)
{
    same_necklace("nicole", "icolen");
    same_necklace("nicole", "lenico");
    same_necklace("nicole", "coneli");
    same_necklace("aabaaaaabaab", "aabaabaabaaa");
    same_necklace("abc", "cba");
    same_necklace("xxyyy", "xxxyy");
    same_necklace("xyxxz", "xxyxz");
    same_necklace("x", "x");
    same_necklace("x", "xx");
    same_necklace("x", "");
    same_necklace("", "");
}
...