Замена символов в строках в C - PullRequest
0 голосов
/ 01 февраля 2020

Я недавно начал использовать C, и у меня возникают проблемы с пониманием использования "&" и "*" и того, где их разместить в моем коде. Текущее назначение, которое я имею, требует, чтобы я взял два ввода: символ в строке, который пользователь хотел бы поменять местами, и новый символ, чтобы заменить его. Мне не разрешено использовать библиотеку String. Вот мой текущий код, но по какой-то причине вывод никогда не может получить доступ к "replacechar [0]", и я понятия не имею, почему. Любая помощь будет оценена. Спасибо!

if(response[0] == yes[0]){
        char replacechar[1];
        printf("What character do you want to replace: ");
        scanf("%s", replacechar);

        char newchar[1];
        printf("What is the replacement character: ");
        scanf("%s", newchar);

        printf("you want to replace %c with %c \n", replacechar[0], newchar[0]);
        for(int i = len-1; i > -1; --i){
            if(word[i] == replacechar[0] && word[i] != '\0'){
                printf("found one\n");
                word[i] = newchar[0];
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Другой подход, кроме getchar или scanf с использованием %s или %c, заключается в использовании fgets. Здесь fgets будет читать до двух символов из stdin. Если choice[1] является новой строкой, был введен только один другой символ. В противном случае очистите stdin и предложите повторить попытку.
Функция replacement продвигает указатель text через каждый символ строки до тех пор, пока символ, указывающий на *text, не станет завершающим нулем.

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

char fgetschar ( void) {
    char choice[3] = "";

    do {
        if ( fgets ( choice, sizeof choice, stdin)) {//read two characters
            if ( '\n' == choice[0]) {//only newline
                printf ( "\nenter a character\n\ttry again\n");
                continue;
            }
            if ( '\n' != choice[1]) {//did not find expected newline
                while ( fgets ( choice, sizeof choice, stdin)) {
                    if ( '\n' == choice[0] || '\n' == choice[1]) {
                        break;
                    }
                }
                choice[1] = 0;//to make the loop repeat
                printf ( "\nenter one character only\n\ttry again\n");
            }
        }
        else {
            fprintf ( stderr, "fgets EOF\n");
            exit ( EXIT_FAILURE);
        }
    } while ( choice[1] != '\n');

    return choice[0];
}

int replacement ( char *text, char find, char sub) {
    int count = 0;

    while ( text && *text) {//not NULL and not terminating zero
        if ( *text == find) {
            *text = sub;
            ++count;
        }
        ++text;//advance to next character
    }

    return count;
}

int main ( void) {
    char replacechar = 0;
    char newchar = 0;
    char word[] = "a b c d e f g h i j k l m n o p q r s t u v w x y z";

    int size = 21;
    int item = rand ( ) % ( size - (int)( size * 0.6));
    printf ( "item %d\n", item);

    printf ( "What character do you want to replace: ");
    fflush ( stdout);
    replacechar = fgetschar ( );
    printf ( "replace character: %c\n\n", replacechar);

    printf("What is the replacement character: ");
    fflush ( stdout);
    newchar = fgetschar ( );
    printf ( "replacement character: %c\n\n", newchar);

    int found = replacement ( word, replacechar, newchar);

    printf ( "found %d instances of %c\n", found, replacechar);

    printf ( "%s\n", word);

    return 0;
}
1 голос
/ 02 февраля 2020

In C, * и & являются операторами указателя. * используется для создания указателей переменных и разыменования их. & используется для получения адреса памяти чего-либо.

Следующий код (1) создает int a, (2) создает указатель int p с помощью *, а (3) устанавливает значение указателя p равным адрес памяти использования &.

int a;
int *p;
p = &a;

printf("%d", p);
printf("%d", *p);

При первом выводе возвращается значение p, которое является адресом памяти a. Во втором выводе мы разыменовываем p, что дает нам данные, хранящиеся по этому адресу памяти - значение int a.

Существуют и другие способы использования указателей. Когда вы создаете массив ...

int arr[10];

... вы неявно создаете указатель ("arr") на первый элемент в вашем массиве. Вы можете получить доступ к элементам, если массив несколькими способами.

arr[5]
*(arr + 5)

Оба получают 5-й элемент массива, посмотрев на arr ( адрес памяти первого элемента) и добавив 5 , который дает нам адрес памяти 5-го элемента, а затем разыменовывает его с помощью *, чтобы получить значение 5-го элемента.

...

Ваш код неправильно не из-за неправильного использования & и *, а из-за поведения scanf (которое на самом деле не следует использовать). Scanf записывает в буфер, который затем необходимо скопировать, чтобы сохранить значение. Кроме того, учитывая, что вы сканируете только один символ, нет необходимости использовать массив символов. Проверьте это решение:

char buf, replacechar, newchar;
printf("What character do you want to replace: ");
scanf("%c", &buf);
replacechar = buf;

printf("What is the replacement character: ");
scanf("%s", &buf);
newchar = buf;

printf("You want to replace %c with %c\n", replacechar,
newchar);
for (int i = len-1; i > -1; --i) {
    if (word[i] == replacechar && word[i] != '\0') {
    printf("Found one!\n");
    word[i] = newchar;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...