Я не могу решить чан персонажей - PullRequest
0 голосов
/ 27 января 2019

Обязательное использование функции, которая возвращает длину строки. Напишите функцию, которая получает две цепочки символов (n1, n2). Функция функции заключается в проверке, является ли строка n2 подпиской на строку n1. Функция возвращает индекс первого вхождения строки n2 в строку n1 (если n2 - строка n1) или -1 (если n2 не является строкой n1). Предположение: надпись n2 короче, чем надпись n1. Пример: надпись n1: «Компьютер» надпись n2: «er» Функция возвращает: 6

Я сделал это, и это работает

#include <stdio.h>

#define LIMIT 50

char * string_in(char *string, char *substring);
char * get(char *string, int n);

int main(void)
{
    // test string_in()

    char string[LIMIT];
    char substring[LIMIT];

    char *substr_loc;

    printf("Enter a string: ");
    get(string, LIMIT);
    while (string[0] != '\0')
    {
        printf("Enter a substring to look for: ");
        get(substring, LIMIT);

        substr_loc = string_in(string, substring);

        if (substr_loc == NULL)
            printf("%s not in %s\n", substring, string);
        else
            printf("%s found in %s at index %lu\n",
                   substring, string, substr_loc - string);

        printf("Enter a string (empty line to quit): ");
        get(string, LIMIT);
    }

    puts("Bye");

    return 0;
}

char * string_in(char *string, char *substring)
{
    // checks if substring is in string
    // returns pointer to first location of substring
    // in string or NULL if substring not in string

    int i;

    while (*string != '\0')
    {
        i = 0;

        // check for substring at current location
        while (*(string + i) == *(substring + i))
        {
            i++;

            // if next char in substring is null, then match
            // is found. return current location
            if (*(substring + i) == '\0')
                return string;
        }

        string++;
    }

    // no match
    return NULL;
}


char * get(char *string, int n)
{
    // wrapper for fgets that replaces first newline with null

    char *return_value = fgets(string, n, stdin);

    while (*string != '\0')
    {
        if (*string == '\n')
        {
            *string = '\0';
            break;
        }

        string++;
    }

    return return_value;
}

следующий шаг Напишите часть программы, которая заменит все вхождения строки n2 в строке n1 на строку (символ '*'). Используйте функцию из заданной точки. Подскажите пожалуйста, как написать эту функцию

Пример: n1: «Очки» n2: «c» строка n1 после изменения. "Spe*ta*le"

void function(char * get, char * string_in)
int i = 0;
for ( i = 0; get[i]=!'\0';i++){
if (get[i] == string_in[o]
get[i] = '*';} 

не работает; <</p>

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Эта задача проста, если вы используете функции, поставляемые с библиотекой C:

void ReplaceString(char *pTarget, const char *pPattern)
{
    char *p;
    size_t PatternLength = strlen(pPattern);

    // for all occurances of the pattern..      
    while (p = strstr(pTarget, pPattern))
    {
        // The function strstr found an occurance of the pattern.
        // So it must be sufficient space in the target starting at the pointer p..

        // replace the characters in the target
        memset(p, '*', PatternLength);
    }
}

Если вам следует избегать использования функций в некоторых академических целях, вы можете реализовать свои собственные версии strlen, strstr и memset. Ваш пример показывает функцию string_in, которая выглядит как такая версия `strstr.

0 голосов
/ 27 января 2019

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

size_t strstrIndex(const char *heap, const char *needle) // returns SIZE_MAX if not found
{
    char *result = strstr(heap,needle);

    return result ? result - heap : SIZE_MAX;
}

char *replace(const char *heap, const char *needle, const char *rep)
{
    size_t pos = 0, nocc = 0;
    size_t len = strlen(heap), nlen = strlen(needle), rlen = strlen(rep);

    char *string;
    char *wstr = (char *)heap;

    while((pos = strstrIndex(wstr, needle)) != SIZE_MAX)
    {
        nocc++;
        wstr += pos + nlen;
    }
    string = calloc(1, len + ((rlen > nlen) ? (rlen - nlen) * nocc : 0) + 1);
    if(string)
    {
        wstr = string;
        while((pos = strstrIndex(heap, needle)) != SIZE_MAX)
        {
            strncpy(wstr, heap, pos);
            heap += pos + nlen;
            wstr += pos;
            strcpy(wstr, rep);
            wstr += rlen;
        }
        if(*heap)
        {
            strcpy(wstr, heap);
        }
    }
    return string;
}

int main()
{
    char *heap = "Spectaclec";

    printf("%s\n", replace(heap, "c", "*"));
    printf("%s\n", replace(heap, "c", "*****"));
    printf("%s\n", replace("ccSpecctaccleccX", "cc", "*****"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...