Вы пытаетесь сохранить значения в строковом литерале, который в современных ОС доступен только для чтения.
Чтобы исправить это, сделайте копию строки, которую вы собираетесь сдвинуть заранее. Не забудьте освободить место для нулевого терминатора и освободить память после того, как вы закончите:
#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("", "");
}