Как исправить это segfault? - PullRequest
1 голос
/ 27 октября 2019
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>



int toggleChars (char* string, char* letters){
    int count = 0;
    char* scurrent = string;
    while(*scurrent != '\0'){
        char* lcurrent = letters;
        while(*lcurrent != '\0'){
            if(*scurrent == *lcurrent){
                *scurrent = '0';
                count += 1;
            }
            lcurrent += 1;
        }
        scurrent += 1;
    }
    return count;
}


int main(){

    char* str = malloc(50);
    char* letters = malloc(20);

    str = "Hi how R U today?";
    letters = "HhiR";

    int x = toggleChars(str, letters);

    printf("str: %s\ncount: %d", str, x);


    return 0;
}

Это просто функция тестирования, которую я сделал для подготовки к предстоящему экзамену по программированию на Си. Когда я компилирую это и запускаю, это дает мне ошибку. В ходе некоторого тестирования я пришел к выводу, что это вызвано строкой

*scurrent = '0';

. Это значит, что я не должен менять символ в этом месте памяти. Но если я захочу это изменить, что мне делать?

1 Ответ

0 голосов
/ 27 октября 2019

Существует проблема с вашим кодом, строка str = "Hi how R U today?"; не будет копировать строку в массив символов, который вы динамически выделяете, вместо этого она будет указывать на const char* (копия только для чтения).

Поэтому из-за этого, когда вы пытаетесь изменить содержимое str с помощью функции toggleChars(), возникает ошибка сегментации.

Вы можете редактировать свой код следующим образом:

#include <stdio.h>

int toggleChars (char* string, char* letters){
    int count = 0;
    char* scurrent = string;
    while(*scurrent != '\0'){
        char* lcurrent = letters;
        while(*lcurrent != '\0'){
            if(*scurrent == *lcurrent){
                *scurrent = '0';
                count += 1;
            }
            lcurrent += 1;
        }
        scurrent += 1;
    }
    return count;
}

int main(){
    char str[] = "Hi how R U today?";
    char letters[] = "HhiR";
    int x = toggleChars(str, letters);
    printf("str: %s\ncount: %d", str, x);
    return 0;
 }

Вместо этого, если вы хотите использовать динамическое выделение памяти, вы можете использовать функцию strcpy() из стандартной библиотеки. https://www.geeksforgeeks.org/strcpy-in-c-cpp/

Спасибо, надеюсь, это поможет,

-Rajkumar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...