У меня есть программа, в которой я хотел удалить пробелы из строки. Я хотел найти изящный способ сделать так, чтобы я нашел следующее (я изменил его немного, так что может быть лучше для чтения) код in a forum:Как C знает конец моей строки?
char* line_remove_spaces (char* line)
{
char *non_spaced = line;
int i;
int j = 0;
for (i = 0; i <= strlen(line); i++)
{
if (line[i] != ' ')
{
non_spaced[j] = line[i];
j++;
}
}
return non_spaced;
}
Как вы можете видеть, функция принимает string и, используя одно и то же выделенное пространство памяти, выбирает только нерасширенные символы. Оно работает!
В любом случае, согласно Википедии, строка в C является «Null-terminated string». Я всегда так думал, и все было хорошо. Но проблема в том, что в конце строки non_spaced
мы не помещаем «нулевой символ». И каким-то образом компилятор знает, что он заканчивается последним символом, измененным строкой «non_spaced». Как это знать?
Что вы подразумеваете под «компилятор знает это»? Вы меняете его во время выполнения, процесс компиляции долгое время. – Fred
@Fred - хорошая точка! –
Для чего это стоит, 'strlen (line)' будет пересчитывать длину строки когда-либо y время. Это нетривиальный расчет и не должен выполняться на каждой итерации цикла. Вы бы гораздо лучше вычислили его один раз и сохранили его: 'size_t len = strlen (line); для (i = 0; i <= len; i ++) '. (Кроме того, все переменные, которые у вас есть как 'int', должны технически быть типом 'size_t'.) –