2016-03-19 4 views
-4

Это код для функции C, которая возвращает 1, если строка s1 появляется перед строкой s2 в словаре или возвращает -1, если s2 появляется перед s2 или возвращает 0, если они одинаковы.Код не работает. Продолжайте получать ошибку сегментации (core dumped)

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int strcmp_ign_case(char *s1, char *s2){ 
    char *s1Copy; 
    char *s2Copy; 
    char *s1Copy3 = s1Copy; 
    char *s2Copy3 = s2Copy; 
    char *s1Copy2 = s1; 
    char *s2Copy2 = s2; 

    while(*s1Copy2 != '\0'){ 
     *s1Copy3 = *s1Copy2; 
     *s1Copy3 = tolower(*s1Copy3); 
     s1Copy3++; 
     s1Copy2++; 
    } 
    *s1Copy3 = '\0'; 

    while(*s2Copy2 != '\0'){ 
     *s2Copy3 = *s2Copy2; 
     *s2Copy3 = tolower(*s2Copy3); 
     s2Copy3++; 
     s2Copy2++; 
    } 
    *s2Copy3 = '\0'; 

    while((*s1Copy != '\0') || (*s2Copy != '\0')){ 
     if(*s1Copy > *s2Copy){ 
      return 1; 
     } else if(*s1Copy < *s2Copy){ 
      return -1; 
     } else { 
      s1Copy++; 
      s2Copy++; 
     } 
    } 

    if((*s1Copy == '\0') && (*s2Copy == '\0')){ 
     return 0; 
    } 
} 

Я не понимаю, что не так с кодом. Пожалуйста, помогите мне понять ошибку здесь. Благодаря!

Это главное, что я использую, чтобы проверить:

void main(){ 
    char *a1 = "hello"; 
    char *a2 = "hell"; 
    char *a3 = "world"; 
    printf("strcmp_ign_case1: %d\n", strcmp_ign_case(a1,a2)); 
    printf("strcmp_ign_case2: %d\n", strcmp_ign_case(a1,a3)); 
    printf("strcmp_ign_case3: %d\n", strcmp_ign_case(a2,a3)); 
} 
+2

ли вы использовать отладчик, чтобы увидеть, какие строки вызывает сбой? – immibis

+0

Изначально 's1Copy' и' s2Copy' не определены, не так ли? Но вы затем используете их для инициализации 's1Copy3' и' s2Copy3', что бессмысленно, поскольку вы просто копируете неопределенные значения. Таким образом, все 4 из них не определены. Затем в первом цикле вы пытаетесь сохранить '* s1Copy3'. Это ошибка доступа к памяти, поскольку вы храните ее через неопределенный указатель. Игра закончена. –

ответ

0

Спасибо за вашу помощь, ребята.

Я исправил свою ошибку, как это:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int strcmp_ign_case(char *s1, char *s2){ 
    char *s1Copy = s1; 
    char *s2Copy = s2; 

    while(*s1Copy != '\0') || (*s2Copy != '\0')){ 
     if(tolower(*s1Copy) > tolower(*s2Copy)){ 
      return 1; 
     } else if(tolower(*s1Copy)< tolower(*s2Copy)){ 
      return -1; 
     } else { 
      s1Copy++; 
      s2Copy++; 
     } 
    } 

    if((*s1Copy == '\0') && (*s2Copy == '\0')){ 
     return 0; 
    } 
} 
2

Смотрите комментарии:

int strcmp_ign_case(char *s1, char *s2){ 
    char *s1Copy; // uninitialized pointer 
    char *s2Copy; 
    char *s1Copy3 = s1Copy; // copy of uninitialized pointer 
    char *s2Copy3 = s2Copy; 
    char *s1Copy2 = s1; 
    char *s2Copy2 = s2; 

    while(*s1Copy2 != '\0'){ 
     *s1Copy3 = *s1Copy2; // dereferenced uninitialized pointer (crash) 
Смежные вопросы