Заменить строку в C? - PullRequest
       3

Заменить строку в C?

1 голос
/ 24 марта 2011

Напишите программу, которая принимает существительные и образует их множественное число на основе эти правила: Если существительное оканчивается на «у» уберите «у» и добавьте «и» б. Если существительное оканчивается на «s», «ch» или «sh», добавьте «Эс» в. Во всех остальных случаях просто добавьте «S» Напечатайте каждое существительное и его множественное число. Попробуйте следующие данные: стул
молочный босс цирковая муха церковное блюдо

Это то, что у меня так далеко, но оно не совсем работает так, как должно:

#include<stdlib.h>
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#define SIZE    8

char *replace_str(char *str, char *orig, char *rep)
{
    static char buffer[4096];
    char *p;
    if(!(p = strstr(str, orig)))
        return str;
    strncpy(buffer, str, p-str);
    buffer[p-str] = '\0';
    sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
    return buffer;
}

int main(void)
{
    char plural[SIZE];
    printf("Enter a noun: ");
    scanf("%c",&plural);
    bool noreplace = false;

    puts(replace_str(plural, "s","es"));
    puts(replace_str(plural, "sh","es"));
    puts(replace_str(plural, "ch","es"));
    puts(replace_str(plural, "y", "ies"));
    if(noreplace) {
    puts(replace_str(plural, "","s"));
    }
    system("pause");
    return 0;
}

Я давно не посещал уроки С, может кто-нибудь мне помочь? Спасибо.

Ответы [ 6 ]

3 голосов
/ 24 марта 2011

Вы читаете слово как:

scanf("%c",&plural);

, что неверно, поскольку он читает только один символ.

Измените его на:

scanf("%s",plural);

или даже лучше использовать fgets как:

fgets (plural,SIZE, stdin);

Но учтите, что fgets может добавить символ новой строки в конце строки. Если это так, вам нужно удалить его перед заменой, так как замена зависит от последнего символа в слове.

Также ваша запасная часть неверна. Вы заменяете любой s на es (то же самое с другими заменами). Вам нужно заменить только последний s.

2 голосов
/ 24 марта 2011

Для начала scanf("%c") получает один символ, не строку. Для этого вы должны использовать fgets, например:

fgets (plural, SIZE, stdin);
if (buffer[strlen(buffer)-1] == '\n')    // Remove newline if there.
    buffer[strlen(buffer)-1] = '\0';

Как только вы исправите это, мы можем перейти к функции, которая множит слова вместе с приличным тестовым набором. Убедитесь, что у вас есть собственный main (с фиксированным методом ввода), поскольку в этом жгуте есть пара вещей, которые, вероятно, заставят вашего преподавателя подозревать, что это не ваш код. Я просто включил его для наших целей тестирования здесь.

Начните с чего-то вроде:

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

char *pluralise(char *str) {
    static char buffer[4096];
    strcpy (buffer, str);
    return buffer;
}

int main(void)
{
    char *test[] = {
        "chair", "dairy", "boss", "circus", "fly",
        "dog", "church", "clue", "dish"
    };
    size_t i;

    for (i = 0; i < sizeof(test)/sizeof(*test); i++)
        printf ("%-8s -> %s\n", test[i], pluralise (test[i]));

    return 0;
}

Это просто возвращает вам именно то, что вы прошли, но это хорошее начало:

chair    -> chair
dairy    -> dairy
boss     -> boss
circus   -> circus
fly      -> fly
dog      -> dog
church   -> church
clue     -> clue
dish     -> dish

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

Строка представляет собой массив символов вида:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| c | h | a | i | r | $ |
+---+---+---+---+---+---+

где $ представляет нулевой терминатор \0. Числа выше дают смещение от начала или индекс, который вы можете использовать, чтобы получить символ из определенной позиции в этом массиве. Так что str[3] даст вам i.

Используя это и длину строки (strlen(str) даст вам 5), вы можете проверить определенные символы. Вы также можете скопировать символы в целевой буфер и использовать аналогичный метод, чтобы изменить конец.

Как и любой хороший наркоторговец, я собираюсь дать вам первый удар бесплатно: -)

char *pluralise(char *str) {
    static char buffer[4096];
    size_t sz = strlen (str);                // Get length.
    if (sz >= 1) {                           // Only try this if long enough.
        if (str[sz-1] == 'y') {              // Is last character 'y'?
            strcpy (buffer, str);            // Yes, copy whole buffer.
            strcpy (&(buffer[sz-1]), "ies"); // Overwrite from last character.
            return buffer;                   // Return it.
        }
    }
    strcpy (buffer, str);                    // If none match,
    strcat (buffer, "s");                    //   just add "s"
    return buffer;                           //   and return it.
}

Особый интерес представляет последовательность:

strcpy (buffer, str);
strcpy (&(buffer[sz-1]), "ies");

Первая строка создает точную копию строки, например:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+

Вторая строка копирует строку "ies" в ячейку памяти buffer[sz-1]. Поскольку sz равно 5, это будет смещением 4, что приведет к следующему изменению:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+---+---+
                | i | e | s | $ |
                +---+---+---+---+

так что в итоге вы получите dairies.

Исходя из этого, вы должны иметь возможность использовать те же методы для обнаружения других концов строк и выполнять аналогичные операции копирования / изменения для правильного множественного распределения строк.

0 голосов
/ 24 марта 2011

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

0 голосов
/ 24 марта 2011

Прежде всего вам нужно найти последнюю позицию вхождения, а затем вызвать функцию replace_str () и, во-вторых, scanf ("% s", & множественное число) или использовать fgets ()

0 голосов
/ 24 марта 2011
puts(replace_str(plural, "ch","es"));

Рассмотрим ввод: church

strstr(3) найдет первое ch, а не последнее ch. По электронной почте Ой.

Более того, как только вы измените replace_str(), чтобы найти последний ch, вы все равно срываете его и не надеваете обратно: chures. (Предполагая, что ваши replace_str() работают так, как я думаю, работает; это какой-то волосатый код. :) Поэтому добавьте ch обратно:

puts(replace_str(plural, "ch","ches"));
0 голосов
/ 24 марта 2011

Может быть, это может вам помочь: str_replace

это хорошо сделано!

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