2013-10-24 2 views
0

В настоящее время я изучаю C с помощью книги «Программирование в 3-м издании» Стивена Г. Кочана.Функция replaceString() в C

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

replaceString(text, "1", "one"); 

Заменит, если есть, «1» в строку символов текста с «один».

Чтобы FULLFILL этого упражнения, вам нужны функции FindString(), insertString() и removeString().

Это функция FindString()

int findString (const char source[], const char s[]) 
{ 
    int i, j; 
    bool foundit = false; 

    for (i = 0; source[i] != '\0' && !foundit; ++i) 
    { 
     foundit = true; 

     for (j = 0; s[j] != '\0' && foundit; ++j) 
      if (source[j + i] != s[j] || source[j + i] == '\0') 
       foundit = false; 

     if (foundit) 
      return i; 
    } 

    return -1; 
} 

Если с [] находится внутри источника строки [], он возвращает целое число, равное начальной точки для с [] внутри Струна. Если он не находит s [] он вернет -1.

Функция insertString() заключается в следующий

void insertString (char source[], char s[], int index) 
{ 
    int stringLength (char string[]); 
    int j, lenS, lenSource; 

    lenSource = stringLength (source); 
    lenS  = stringLength (s); 

    if (index > lenSource) 
     return; 

    for (j = lenSource; j >= index; --j) 
     source[lenS + j] = source[j]; 

    for (j = 0; j < lenS; ++j) 
     source[j + index] = s[j]; 
} 

Эта функция принимает три аргумента т.е. источник [], сек [] и индекса []. s [] - это строка, которую я хотел бы поместить в источник [] и индекс [] - это то, где он должен начинаться (например, insertString («Сын», «per», 4) делает исходную строку «Человек»).

Функция включает в себя другую функцию, называемую stringLength(), цель которой при ее имени одинакова. Это StringLength()

int stringLength (char string[]) 
{ 
    int count = 0; 

    while (string[count] != '\0') 
     ++count; 

    return count; 
} 

removeString() принимает три аргумента т.е. слова, я и графа. Функция удаляет несколько символов внутри другой символьной строки. Эта функция я еще не смог сделать.

Просто, чтобы подвести итог, мой вопрос:

Как мне сделать функцию replaceString(), которая ищет слова в строке символов, и если она есть, то она заменяет его другой?

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

UPDATE

Это код, который я сделал до сих пор

// replaceString() program 

#include <stdio.h> 
#include <stdbool.h> 

int findString (char source[], char s[]) 
{ 
    int i, j; 
    bool foundit = false; 

    for (i = 0; source[i] != '\0' && !foundit; ++i) 
    { 
     foundit = true; 

     for (j = 0; s[j] != '\0' && foundit; ++j) 
      if (source[j + i] != s[j] || source[j + i] == '\0') 
       foundit = false; 

     if (foundit) 
      return i; 
    } 

    return -1; 
} 

int stringLength (char string[]) 
{ 
    int count = 0; 

    while (string[count] != '\0') 
     ++count; 

    return count; 
} 


void replaceString(char source[], char str1[], char str2[]) 
{ 
    int findString(char source[], char s[]); 
    int stringLength(char string[]); 
    int start; 

    if (findString(source, str1) == -1) 
     return; 
    else 
    { 
     start = findString(source, str1); 

     int lenSource = stringLength(source); 
     int lenStr2 = stringLength(str2); 
     int counter = lenStr2; 
     for (lenSource; lenSource > start + lenStr2; --lenSource) 
     { 
      source[lenSource + lenStr2] = source[lenSource]; 
     } 

     int i = 0; 

     while (i != counter) 
     { 
      source[start + i] = str2[i]; 
      ++i; 
     } 
    } 
} 

int main (void) 
{ 
    void replaceString(char source[], char str1[], char str2[]); 

    char string[] = "This is not a string"; 
    char s1[] = "not"; 
    char s2[] = "absolutely"; 

    printf ("Before: \n %s \n\n", string); 

    replaceString(string, s1, s2); 

    printf ("After: \n %s \n\n", string); 

    return 0; 
} 

Этот код дает следующий результат:

До: Это не строка

После: Это абсолютно

Как вы можете видеть, я не включил функцию removeString(), так как я не мог нормально работать с этой функцией. Где ошибка в моей программе?

+1

Почему бы вам не показать, что у вас есть до сих пор? – alk

+0

Теперь я загрузил то, что сделал до сих пор. –

+0

Не могли бы вы выработать 'removeString'? У меня были проблемы с этой простой функцией, когда я изменил ее, чтобы сначала найти нулевой символ (чтобы сделать его менее подверженным ошибкам). –

ответ

0

для стартеров длина вашей строки фиксирована. поэтому, если «место назначения» больше, чем «источник», то это не сработает. insert string необходимо передать в указатель, тогда вы можете выделить строку в куче, которая достаточно длинна, чтобы содержать длину (источник) - длину (удалить) + длину (добавить) и вернуть этот указатель

0

Скажите replaceString() args are (char source[], char s1[], char replacement[])

Чтобы найти s1, вы должны использовать findString(). Если он находит это, с учетом позиции s1, используйте removeString(), чтобы удалить эту строку, а затем insertString(), чтобы вставить replacement в это положение.

Смежные вопросы