Удаление предложения только для его буквенных символов
Я пытаюсь решить код, чтобы разделить предложение только до его буквенного символа, используя следующий код, но код всегда дает мне ошибку времени выполнения (закомментированные части - это шаги, которые я предпринял, чтобы найти решение).
[Пример: Test'Stensent должен печатать Testsentence]
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define BUFFER_LEN 1000
#define BUFFER_INCR 15
int main(void)
{
int buffer_length = BUFFER_LEN;
char *pString = malloc(BUFFER_LEN);/* initial array */
char *pTemp_start = pString;
long long int String_len = 0;
char *pTemp = NULL;
int copy = 0;
int count = 0;/*delete this after check*/
while((*pString++ = getchar()) != '\n')
{
String_len = pString - pTemp_start;
printf("\nThe character you inputted is: %c", *(pString+count++));
//getchar();
if(String_len == (buffer_length - 1))/*reserve one for newline*/
{
buffer_length += BUFFER_INCR;
pTemp = realloc(pString, buffer_length);/*reallocate space for
15 more chars.*/
pTemp_start = pTemp - String_len;
pString = pTemp;
free(pTemp);
pTemp = NULL;
if(!pString)
{
printf("The space couldn't be allocated");
return 1;
}
}
}
/*checks that can be done for addresses*/
//printf("\nThe length of the string is: %lld", pString - pTemp_start);
*(--pString) = '\0';
//printf("\nThe charcter at the end is: %d", *(pString + String_len - 1));
//printf("\nThe character at the mid is: %d", *(pString + 2));
printf("The input string is: %c", *pString);
/*code to remove spaces*/
for(int i = 0; i < (String_len + 1); i++)
{
if((isalnum(pString[i])))
{
*(pString + copy++) = *(pString +i);
}
}
*(pString + copy) = '\0';/*append the string's lost null character*/
printf("\nThe stripped string is: \n%s", pString);
return 0;
}
Код просто не печатает ничего, что было введено.
2 ответа
Таким образом, у вас есть конфликт в вашем коде между этой строкой
while((*pString++ = getchar()) != '\n')
и строки, подобные следующим.
pTemp = realloc(pString, buffer_length);
Первая строка, которую я процитировал, увеличивает позицию pString в выделенной памяти, но вторая действует так, как будто pString все еще указывает на ее начало. realloc()
не будет работать, если pString не указывает на начало выделенной памяти. Вы тогда не проверяете результаты realloc()
вызов, назначая новый блок памяти pString, а затем освобождая вновь выделенную память. Так что вы определенно получите неожиданные результаты.
Вы также должны помнить, что stdin буферизуется, поэтому ваш код будет ждать, пока он не прочитает всю строку, прежде чем что-либо делать. И stdout также буферизуется, поэтому только строки, заканчивающиеся на \n
будет вывод. Таким образом, вы, вероятно, хотите иметь следующее...
printf("The character you inputted is: %c\n", *pString);
... или что-то подобное, учитывая проблемы с использованием pString.
realloc(pString,...)
не добавляет выделенный блок, он заменяет перераспределяемый блок (в этом случае pString
). Так pString
не является (обязательно) действительным указателем после этого вызова. Хуже то ты free(pTemp)
таким образом, у вас больше нет ничего выделенного.