Некоторые общие советы:
Избегайте глобальных переменных. Значение dist
вычисляется исключительно в пределах cleanup
- оно должно быть локальным для этой функции, а затем возвращаться из нее, чтобы функция main
могла использовать его.
Рассмотрите возможность продвижения указателей вместо использования индексации в стиле массива, чтобы уменьшить количество необходимых вам переменных:
void stringtolower(char *s)
{
char c;
while (*s != '\0')
{
c = *s;
c = tolower(c);
*s = c;
s++;
}
}
И объявляйте переменные как можно ближе к месту их использования, и инициализируйте их так, как вы их объявили:
void stringtolower(char *s)
{
while (*s != '\0')
{
char c = *s;
c = tolower(c);
*s = c;
s++;
}
}
И избегайте делать временные копии там, где они не добавляют никакой дополнительной ясности:
void stringtolower(char *s)
{
while (*s != '\0')
{
*s = tolower(*s);
s++;
}
}
И рассмотрите возможность использования for
для выражения обычного итерационного шаблона:
void stringtolower(char *s)
{
for (; *s != '\0'; s++)
*s = tolower(*s);
}
Вот аналогичная работа, проделанная на cleanup
:
int cleanup(char *s)
{
char *p = s;
for (; *p == '\r' || *p == '\n' || *p =='\t'; p++);
int dist = p - s;
for (; *p != '\0'; p++)
{
if (*p == ':' ||
*p == '\t' ||
*p == '\n' ||
*p == '\r' ||
*p == '"' ||
*p == '`' )
{
*p = '\0';
break;
}
}
return dist;
}
Выберите один из способов размещения фигурных скобок и придерживайтесь его.
Попробуйте использовать std::find
из <algorithm>
вместо вашего isinlist
.
С другой стороны, для сохранения списка, подобного этому, чтобы вы могли искать ранее обработанные значения, используйте std::set
вместо std::list
. Он имеет встроенную функцию find
, которая будет работать намного быстрее, чем линейный поиск:
std::set<std::string> sent;
...
if (sent.find(x) != sent.end())
continue;
sent.insert(x);
Предпочитают std::string
представлять значения промежуточной строки. Вы можете использовать символьные указатели для удобной манипуляции, но вы также можете писать код безопасным способом, пока не получите доказательство того, что это значительная причина, по которой ваша программа работает медленно.
Используйте std::ifstream
для чтения ввода из файла. Он автоматически закроет файл после использования, что вы забудете сделать с fclose
.
Если вы сделаете все это, ваша программа будет намного короче и более читабельной, и вам будет легче узнать, когда вы что-то не так.