-2

我正在尝试使用以下代码解决代码以将句子仅剥离为字母字符,但该代码总是给我一个运行时错误(注释部分是我为找出解决方案而采取的步骤)。
[例如:Test'sentence 应该打印 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;


}

该代码根本不打印输入的任何内容。

4

2 回答 2

1

所以你的代码在这一行之间有冲突

while((*pString++ = getchar()) != '\n')

和如下行。

pTemp = realloc(pString, buffer_length);

我引用的第一行是增加 pString 在分配的内存中的位置,但第二行的行为好像 pString 仍然指向它的开头。realloc()除非 pString 指向已分配内存的开头,否则将不起作用。然后,您不会检查realloc()调用的结果,将新的内存块分配给 pString,然后释放新分配的内存。所以你肯定会得到意想不到的结果。

您还必须记住 stdin 是缓冲的,因此您的代码将等到它读完一整行后再做任何事情。并且 stdout 也被缓冲,所以只有以 a 结尾的行\n才会被输出。所以你可能想要以下...

printf("The character you inputted is: %c\n", *pString);

...或类似的东西,请记住您如何使用 pString 的问题。

于 2017-03-20T12:07:27.823 回答
1

realloc(pString,...)添加分配的块,它会替换正在重新分配的块(在本例中为pString)。所以pString在调用之后不是(必然)一个有效的指针。更糟糕的是,你然后free(pTemp),所以你不再有任何分配。

于 2017-03-20T11:52:27.763 回答