Я искал переполнение стека для помощи по своей функции void strip(char *s)
и не нашел подходящего ответа, соответствующего моим требованиям. Каждая реализация, которую я пробовал, приводила к SEGFAULT
.
Моя идея состоит в том, чтобы увеличивать указатель на символ s
до тех пор, пока не будут использованы все пробелы. Тогда у меня есть указатель на конец строки end
. Я уменьшаю этот указатель до тех пор, пока все пустое пространство не будет уничтожено. Я подключил свой код в GDB, чтобы убедиться, что все указывает правильно, что он делает. Однако, когда я пытаюсь отрезать пробел, вставляя нулевой символ, чтобы обозначить конец новой подстроки, я не могу заставить его работать.
СМОТРЕТЬ РЕДАКТИРОВАТЬ:
void strip(char *s) {
char *end;
int length = strlen(s);
end = s + length - 1;
while (1) {
if (*s == ' ' || *s == '\t' || *s == '\n') {
s++;
} else {
break;
}
}
while (1) {
if (*end == ' ' || *end == '\t' || *end == '\n') {
// *end = '\0'; my current implementation has this uncommented
end--;
} else {
break;
}
}
}
int main(void) {
char *string = "\tHello, World\t";
strip(string);
printf("%s\n", string);
}
Насколько я понимаю, по крайней мере, главная функция должна печатать Hello, World\t
. с задней вкладкой все еще на месте. Однако консоль выводит \tHello, World\t
, как если бы указатель никогда не перемещался.
Вот номер реализации 2. Этот использует два указателя для начала и конца. Затем создает новую строку для s, на которую можно указать. Это также приводит к распечатке \tHello, World\t
. GDB, с другой стороны, видит temp как Hello, World
.
void strip(char *s) {
char *start, *end;
int length = strlen(s);
end = s + length - 1;
while (1) {
if (*start == ' ' || *start == '\t' || *start == '\n') {
start++;
} else {
break;
}
}
while (1) {
if (*end == ' ' || *end == '\t' || *end == '\n') {
end--;
} else {
break;
}
}
char temp[length];
int index = 0;
while (start <= end) {
temp[index++] = *start;
start++;
}
temp[index] = '\0';
s = temp;
}
EDIT
void strip(char *s)
{
char *end;
int length = strlen(s);
end = s + length - 1;
// while a character is a space AND didn't reach the end
while (s != NULL && isspace(*s))
{
s++;
}
// While end has not passed ptr s AND is a space
while (end > s && isspace(*end))
{
// replace the whitespace
*end = '\0';
end--;
}
}
int linesff(const char *s, char **lines)
{
FILE *fp;
if ((fp = fopen(s, "r")) == NULL)
{
printf("Cannot open file: %s\n", s);
return -1;
}
// max buffer size
char buf[MAX_C];
int index = 0;
// while Not EOF
while (!feof(fp))
{
// get a line to put in buf
fgets(buf, MAX_C, fp);
// strip buf
strip(buf);
// if buf is greater than 1, meaning line has characters left
if (strlen(buf) > 1)
{
// add buf at index
lines[index] = buf;
index++;
}
}
// return the count
return index;
}
Strip - вспомогательная функция для linesff, которая удаляет пробелы. **lines
создается следующим образом:
for (int i = 0; i < MAX_L; i++)
lines[i] = malloc(MAX_C);
Мне все еще не удается изменить buf
, чтобы он содержал правильно очищенную строку.