2014-12-09 2 views
-1
void addSubString(char subString[], char help[], int *position, int until){ 
    int counter = 0; 
    for (; counter< until; counter++, (*position)++){ 
     help[*position] = subString[counter]; 
    } 
} 

void addReplaceWith(char replaceWith[], char help[], int *position){ 
    int counter = 0; 
    for (; replaceWith[counter] != '\0'; counter++, (*position)++){ 
     help[*position] = replaceWith[counter]; 
    } 
} 

звонки:Изменить код без указателей

addReplaceWith(replaceWith, help, &helpCounter) 
addSubString(subString, help, &helpCounter, subStringHelp); 
+0

* Почему вы не хотите делать указатели? – ArjunShankar

+0

Сначала очистите свой код; INDENT: C не заботится. Затем измените все '(* position)' на 'position', за исключением случаев, когда вы говорите' int * position', уже установлено, что 'position' является' int * 'после того, как объявлен параметр функции. – Gophyr

+0

Возможный дубликат [Каковы различия между переменной-указателем и ссылочной переменной в C++?] (Http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable- and-a-reference-variable-in) –

ответ

1

Как насчет:

int addSubString(char subString[], char help[], int position, int until){ 
    int counter = 0; 
    for (; counter< until; counter++, position++){ 
     help[position] = subString[counter]; 
    } 
    return position; 
} 

int addReplaceWith(char replaceWith[], char help[], int position){ 
    int counter = 0; 
    for (; replaceWith[counter] != '\0'; counter++, position++){ 
     help[position] = replaceWith[counter]; 
    } 
    return position; 
} 

вызовов:

helpCounter = addReplaceWith(replaceWith, help, helpCounter) 
helpCounter = addSubString(subString, help, helpCounter); 

Я предполагаю, что "substringHelp" часть была опечатка?

+0

Технически массивы - это просто другой способ написания указателей. – swstephe

+0

Это не прямой перевод, член позиции будет отличаться после вызова функции, im не уверен, что это важно для OP.Вы должны убедиться, хотя. –

+0

Я предполагаю, что «никакие указатели» означают, что по какой-то причине они хотят вызывать регулярные параметры, возможно, поэтому не будут изменять переменные на месте, и вы могли бы назвать его целыми аргументами, например. – swstephe

1
void addSubString(char subString[], char help[], int position, int until); 

Вы можете изменить свой прототип функции, как показано выше.

Если значение position необходимо поддерживать между двумя вызовов функций, то вы можете сделать это как static или сделать positionglobal и использовать его

1

Вы можете изменить int *position к int position в параметрах, а затем использовать position++ вместо (*position)++ в методах.

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

int addSubString(char subString[], char help[], int position, int until) { 
    int counter = 0; 
    for (; counter < until; counter++, position++){ 
    help[position] = subString[counter]; 
    } 
    return position; 
} 

Тогда вы могли бы назвать:

helpCounter = addSubString(subString, help, helpCounter, subStringHelp); 

Однако, я бы не советовал это по двум причинам:

  • , когда требуется изменить более чем одно измененное значение, невозможно следовать этому подходу
  • Это типичная ситуация, в которой указатели предназначены для использования: их семантика поможет указать, что ваши функции могут изменять параметры, переданные в качестве указателей, просто читая декларацию. Вместо этого возвращаемое значение является гораздо более загадочным, если оно не адаптируется к естественной семантике функции. Пример: в int square(int) смысл возвращаемого значения очевиден, а в
    int addSubString(char[], char[], int, int) это точно нет.
Смежные вопросы