2009-05-29 6 views
2

Используя только CРазобрать строку в C

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

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

и вопрос ....? –

+4

это домашнее задание? – Eineki

+2

Звучит как домашнее задание. Вы должны попытаться решить проблему самостоятельно - это очень просто - и задайте здесь вопросы, если вы испортите конкретные проблемы. – 2009-05-29 08:26:09

ответ

9

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

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

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

} 

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

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

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

#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); 
} 
3

Эта функция будет принимать строку, заменить все «е» с «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; 
} 
+0

Я серьезно не знаю, почему это произошло. Комментарий? –

+7

Потому что это решение для домашнего задания, я думаю (нет, я не был downvoter). Публикация фактически работающих кодовых решений для домашней работы просто поощряет плохое поведение на стороне ленивых людей :) – Joey

+0

Упрощение с тегом домашней работы не было в исходном вопросе, оно было добавлено кем-то другим. – paxdiablo

2

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

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

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

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

    • Установите символ в указателе на «3», если «e» не найден.

2

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

Лучше старт будет

char *string = "hello world"; 
Assert(ReplaceCharInString(string, 'e', '3') == 1); 
Assert(strcmp(string, "h3llo world") == 0); 
+0

Это, предположительно, предложение написать тест в первую очередь. Это интересно, но я не уверен, что это лучший метод для написания кода с большим количеством указателей на C из-за непредсказуемых и неповторимых эффектов неполного кода. – Edmund

+0

@ Edmund Мне было бы интересно узнать, почему это может быть так. По крайней мере, тесты указывают, что нужно делать, и подтверждает, что это так. –

+0

Я думаю, что тесты полезны, но я думаю, что боль от написания их и получения их работы с нуля больше в C, чем в не-pointery Языки и, следовательно, преимущество TDD уменьшается. Если он терпит неудачу не изящно, гораздо труднее понять, почему. Если он пройдет, он может по-прежнему нарушать другие тесты. – Edmund

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

  • Нет связанных вопросов^_^