2016-11-13 3 views
1

Я пытаюсь написать код, который заменит символ в строке, которую пользователь выбирает символом, который он/она делает. Например, строка london, если пользователь выбирает o и a, тогда выход должен быть landan.Замена и замена символов в C

Вот код:

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

#define MAXLEN 100 

int function2(char str[], char drop, char sub) { 
    int i = 0; int num = 0; 
    while (str != NULL) { 
     if (str[i] == drop) { 
      str[i] = sub; 
      num++; 
     } 
     i++; 
    } 
    return num; 
} 

int main() { 
    char d, s; 
    char my_string[MAXLEN]; 

    printf("Input your string\n"); 
    scanf("%s", &my_string); 
    printf("Input character you want to drop\n"); 
    scanf(" %c", &d); 
    printf("Now character you want to substitute\n"); 
    scanf(" %c", &s); 
    function2(my_string, d, s); 
    printf("The string is %s\n", my_string); 
    return EXIT_SUCCESS; 
} 

Он не работает до того момента, когда вы на самом деле печатать измененную строку. Все, что я получаю, это Segmentation fault (core dumped). Обратите внимание, что код для функции не был моим (я нашел его на каком-то веб-сайте, поэтому владелец исходного кода для функции2- Спасибо заранее). Любая помощь будет оценена!

+1

'в то время как (ул = NULL) {' -> ', а (ул [я]) { '. Также необходимо '#include ' – BLUEPIXY

+0

@BLUEPIXY: зачем требовать ''? '' даже не требуется, 'NULL' определяется в' 'среди многих стандартных заголовков. – chqrlie

+0

@chqrlie для 'EXIT_SUCCESS' – BLUEPIXY

ответ

1

Прежде всего, вам следует избегать использования scanf. Если вас интересует причина и альтернативы, нажмите here.

Но вернемся к вашей проблеме

while(str != NULL) 

бесконечный цикл, поскольку указатель не станет NULL

while(str[i] != '\0') 

должен сделать трюк. Он проверяет каждый раз, если вы уже достигли конца строки.

+0

Работал отлично! Большое спасибо – Egor

0
if (str != null){ 
     while(str[i] != '\0'){ 
     if (str[i] == drop){ 
      str[i] = sub; 
      num++; 
     } 
     i++; 
     } 
    } 

ул представляет собой массив символов, с str != NULL, вы убедитесь, что точка массива на действительный адрес памяти. С циклом while и i ++ вы зацикливаете все символы в массиве, потому что строка заканчивается на «\ 0», вам необходимо остановить цикл с помощью while(str[i] != '\0').

0

Ваша функция запускает бесконечный цикл, поскольку str никогда не станет NULL, но так как i увеличивается, str[i] в конечном итоге получить доступ к памяти за пределами конца строки, и в какой-то момент недействительных памяти, вызывающей Segmentation fault.

Обратите внимание, что не просто сообщить scanf() максимальное количество символов для чтения в my_string. Использование fgets() намного безопаснее и позволяет заменить всю фразу.

Вот исправленный вариант:

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

#define MAXLEN 100 

int function2(char str[], char drop, char sub) { 
    int num = 0; 
    for (int i = 0; str[i] != '\0'; i++) { 
     if (str[i] == drop) { 
      str[i] = sub; 
      num++; 
     } 
    } 
    return num; 
} 

int main(void) { 
    char d, s; 
    char my_string[MAXLEN]; 

    printf("Input your string\n"); 
    if (!fgets(my_string, MAXLEN, stdin)) 
     return EXIT_FAILURE; 
    printf("Input character you want to drop\n"); 
    if (scanf(" %c", &d) != 1) 
     return EXIT_FAILURE; 
    printf("Now character you want to substitute\n"); 
    if (scanf(" %c", &s) != 1) 
     return EXIT_FAILURE; 
    function2(my_string, d, s); 
    printf("The modified string is %s", my_string); 
    return EXIT_SUCCESS; 
} 
Смежные вопросы