Разобрать строку в C - PullRequest
2 голосов
/ 29 мая 2009

Использование только C

Я бы хотел разобрать строку и:

  1. подсчитать вхождения символа в строку (например, подсчитать все 'e' s в переданной строке)
  2. После подсчета (или даже по мере того, как я считаю) замените е на 3

Ответы [ 5 ]

9 голосов
/ 29 мая 2009

ОК, вы либо ленивы, либо застряли, если вы застряли.

Вам нужна функция с подписью что-то вроде

int ReplaceCharInString(char* string, char charToFind, char charThatReplaces)
{

}

Внутри нужной вам функции

  1. Чтобы объявить целое число для подсчета вхождения
  2. Цикл, который перемещается с начала строка до конца
  3. внутри цикла, оператор if для проверить текущий символ charToFind
  4. операторов для увеличения числа случаи и выполнить замена
  5. После цикла вам нужно вернуться количество вхождений
3 голосов
/ 29 мая 2009

Эта функция будет принимать строку, заменять каждое 'e' на '3' и возвращать количество выполненных замен. Это безопасно, это чисто, это быстро.

int e_to_three(char *s)
{
    char *p;
    int count = 0;
    for (p = s; *p; ++p) {
        if (*p == 'e') {
            *p = '3';
            count++;
        }
    }
    return count;
}
2 голосов
/ 29 мая 2009

Некоторые из вас, ребята, начинают с середины.

Лучшее начало было бы

char *string = "hello world";
Assert(ReplaceCharInString(string, 'e', '3') == 1);
Assert(strcmp(string, "h3llo world") == 0);
2 голосов
/ 29 мая 2009

В общем, лучше использовать стандартную библиотечную функцию, а не собственную. И, как это только что произошло, есть стандартная библиотечная функция, которая ищет строку для символа и возвращает указатель на него. (Он имеет дело со строкой, поэтому ищите среди функций, которые имеют префикс "str") (Функция библиотеки почти наверняка будет оптимизирована для использования специализированных кодов операций ЦП для этой задачи, что рукописный код не будет)

  1. Установить временный указатель (скажем, «ptr») на начало строки.

    • В цикле вызовите указанную выше функцию, используя ptr в качестве параметра, и установите для него возвращаемое значение.

    • Увеличение счетчика.

    • Установите символ в указателе на разрыв "3", когда 'e' не найден.

2 голосов
/ 29 мая 2009

Вот оболочка, с которой можно начать. Спросите здесь, если вам нужна помощь.

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

int main(){
    const char* string = "hello world";
    char buffer[256];
    int e_count = 0;
    char* walker;

    // Copy the string into a workable buffer
    strcpy(buffer,string);

    // Do the operations
    for(walker=buffer;*walker;++walker){
        // Use *walker to read and write the current character
    }

    // Print it out
    printf("String was %s\nNew string is %s\nThere were %d e's\n",string,buffer,e_count);
}
...