2013-11-21 3 views
1

Хит там!Ошибка сегментации при копировании строки до

Ниже представлена ​​небольшая программа, которую я сделал сегодня. Он берет таблицу строк, меняет все строки без реверсирования таблицы, затем сортирует их, перевернутую строку, затем отменяет их назад и, наконец, печатает всю таблицу.

Я очень долго пытался выяснить, почему я не могу скопировать строку замедленного действия в таблицу, указанную в strcmp, но без успеха. Я был бы рад, если бы кто-то нашел способ исправить ошибку сегментации в этом случае, но я действительно хочу оставить метод, как он ниже.

Благодарим за помощь! :)

EDIT С помощью отладчика я решил, что появляется Сегментация Неисправность в зЬгсру, если это не было ясно ...

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

const int ROZMIAR=4; 
char* nieposortowane[]={"basia", "zosia", "ala", "genowefa"}; 

int porownaj(char* a, char* b) 
{ 
return strcmp(a,b); 
} 

void sortowanie(char** tablica, int N) 
{ 
int zamienione, i; 
char tmp; 

do 
{ 
    zamienione=0; 
    for(i=0;i<N-1;i++) 
     if(porownaj(nieposortowane[i], nieposortowane[i+1])>0) 
     { 

      tmp=**(tablica+i); 
      **(tablica+i)=**(tablica+(i+1)); 
      **(tablica+(i+1))=tmp; 

      zamienione=1; 
     } 
} 
while(zamienione); 
} 

void wypisz(char** tablica, int N) 
{ 
int i=0; 
for(i=0;i<N;i++) 
    printf("%s\n", *(tablica+i)); 
} 

void odwr(char** tablica, int N) 
{ 
int i, ln, c; 
int start, koniec; 
char temp; 

for(i=0;i<N;i++) 
{ 
    ln = strlen(tablica[i]); 
    char slowo[ln]; 
    strcpy(slowo,*(tablica+i)); 
    start=0; 
    koniec=ln-1; 
    for(c=0;c<(ln/2);c++) 
    { 
     temp =slowo[start]; 
     slowo[start]=slowo[koniec]; 
     slowo[koniec]=temp; 
     start++; 
     koniec--; 
    } 
    strcpy(*(tablica+i), slowo); 
} 
} 

int main() 
{ 
printf("Przed sortowaniem: \n"); 
wypisz(nieposortowane, ROZMIAR); 

odwr(nieposortowane, ROZMIAR); 
sortowanie(nieposortowane, ROZMIAR); 
odwr(nieposortowane, ROZMIAR); 

printf("Po sortowaniu babelkowym: \n"); 
wypisz(nieposortowane, ROZMIAR); 

return 0; 
} 
+1

«basia» - строковый литерал. строковый литерал переписать запрет. – BLUEPIXY

ответ

0

AFAICS, вы пытаетесь изменить строки в:

char* nieposortowane[]={"basia", "zosia", "ala", "genowefa"}; 

Те строковых литералов хранятся в памяти только для чтения; любая попытка их модификации (например, путем их изменения) завершится неудачей.

Я воспроизвел авария с вашим исходным кодом. Эта ревизия кода не сбой; он переходит в бесконечный цикл в вашем коде сортировки. Я не отлаживал эту часть вашего кода.

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

const int ROZMIAR=4; 
char basia[] = "basia"; 
char zosia[] = "zosia"; 
char ala[] = "ala"; 
char genowefa[] = "genowefa"; 
char* nieposortowane[]={basia, zosia, ala, genowefa}; 

int porownaj(char* a, char* b) 
{ 
return strcmp(a,b); 
} 

void sortowanie(char** tablica, int N) 
{ 
int zamienione, i; 
char tmp; 

do 
{ 
    zamienione=0; 
    for(i=0;i<N-1;i++) 
     if(porownaj(nieposortowane[i], nieposortowane[i+1])>0) 
     { 

      tmp=**(tablica+i); 
      **(tablica+i)=**(tablica+(i+1)); 
      **(tablica+(i+1))=tmp; 

      zamienione=1; 
     } 
} 
while(zamienione); 
} 

void wypisz(char** tablica, int N) 
{ 
int i=0; 
for(i=0;i<N;i++) 
    printf("%s\n", *(tablica+i)); 
} 

void odwr(char** tablica, int N) 
{ 
int i, ln, c; 
int start, koniec; 
char temp; 

for(i=0;i<N;i++) 
{ 
    ln = strlen(tablica[i]); 
    char slowo[ln]; 
    strcpy(slowo,*(tablica+i)); 
    start=0; 
    koniec=ln-1; 
    for(c=0;c<(ln/2);c++) 
    { 
     temp =slowo[start]; 
     slowo[start]=slowo[koniec]; 
     slowo[koniec]=temp; 
     start++; 
     koniec--; 
    } 
    strcpy(*(tablica+i), slowo); 
} 
} 

int main() 
{ 
printf("Przed sortowaniem: \n"); 
wypisz(nieposortowane, ROZMIAR); 

odwr(nieposortowane, ROZMIAR); 
wypisz(nieposortowane, ROZMIAR); 

sortowanie(nieposortowane, ROZMIAR); 
wypisz(nieposortowane, ROZMIAR); 
odwr(nieposortowane, ROZMIAR); 
wypisz(nieposortowane, ROZMIAR); 

printf("Po sortowaniu babelkowym: \n"); 
wypisz(nieposortowane, ROZMIAR); 

return 0; 
} 

Пример вывода:

Przed sortowaniem: 
basia 
zosia 
ala 
genowefa 
aisab 
aisoz 
ala 
afewoneg 

мне пришлось прервать после этого, но вы можете видеть, что строки перепутаны успешно.

Вам необходимо разобраться в более общем решении; называя отдельные массивы, как я сделал, легко для небольшого фиксированного набора, но не в целом. Одна из возможностей заключается в использовании strdup() для дублирования каждой строки в выделенное пространство:

enum { SIZE_NPSW = sizeof(nieposortowane)/sizeof(nieposortowane[0] }; 

for (i = 0; i < SIZE_NPSW; i++) 
    nieposortowane[i] = strdup(nieposortowane[i]); 
+0

Да! Это поставило проблему. Мне пришлось немного изменить функцию сортировки пузырьков из-за изменения глобальных деклараций, но теперь это работает. Спасибо :) – wnerw

2

При выделении slowo, вы должны добавить 1 к результату strlen при расчете размер для распределения. Это должно содержать конечный нулевой символ, который не включен в длину строки (возвращается strlen), но должен быть включен в общий выделенный размер.

+0

Я был бы очень глупым, если бы это было проблемой. Хотя я исправил выделение, добавив от 1 до ln, запуск этой программы по-прежнему дает Segmentation Fault ... – wnerw

+0

Это потому, что BLUEPIXY верен: вы не можете писать в [строковый литерал] (http://bytes.com/topic/c/ответы/213252-строка-строка-буквальным может, кто-объяснить-я)! PS: Польский? – paulsm4

+0

Yep;) Польский, учится в Варшавском технологическом университете. – wnerw

 Смежные вопросы

  • Нет связанных вопросов^_^