TRIM函数是否将内存大小减半以删除空格? [英] trim function halve the memory size to remove the whitespaces?

查看:0
本文介绍了TRIM函数是否将内存大小减半以删除空格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须创建一个可以执行此任务的函数(Trim函数):获取一个以空结尾的字符串,如果该字符串的第0位有空格,则删除该空格。如果空格在字符串的末尾(在零终止符之前),情况也是一样。因此,该函数基本上忽略了字符串中间的空格。

这是我到目前为止尝试做的事情, (1)我将";a b";字符串传递给Trim函数。 (2)(空指针检查)。 (3)使用strlen函数获取字符串的长度。

(4)(这是微妙的部分,因为逐行调试我发现了一个 For循环内的奇怪错误)。

错误是这样的:当调试器运行for循环的第一行时,它会像预期的那样进入循环中;好的,这很好,但是当调试器运行if检查时,它应该是真的(因为在字符串的开头有一个空格),并且函数应该在if主体的第一个if语句中,并重新分配内存。但事实并非如此,因为realloc从不执行。为什么?

(该函数必须返回指向重新分配的内存的指针)。

另一个错误是";s";未初始化,但我还是使用了它,但事实并非如此,因为我使用";a b";字符串初始化了%s。

char* trim(const char* s) {    
    if (s == NULL) {  
        return NULL; 
    } 
    size_t length = strlen(s);
    for (unsigned int i = 0; s[i] != ''; i++) { 
            

        if (s[i] == " ") {
            realloc(s, length - sizeof(char));       
        } 
    }
    return s; 

}
int main(void) {

    
    trim(" a b ");

    return 0; 
}

推荐答案

在if语句中,您正在尝试将chars[i]类型的对象与隐式字符串文字" "进行比较;它只是转换为指向其第一个元素的指针。

   if (s[i] == " ") {

很明显,这样的比较结果为逻辑假。

您需要使用整型字符常量' ',而不是字符串文字。

   if (s[i] == ' ') {

也是这种内存重新分配

realloc(s, length - sizeof(char));       

没有意义,因为至少重新分配的内存的地址没有存储在任何地方。

不得触摸源字符串s。您需要动态分配一个新的字符数组,并将经过剪裁的源字符串复制到那里。

如下面的演示程序所示,可以按以下方式定义函数。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

char * trim( const char *s ) 
{
    const char *first = s;
    
    while ( isblank( ( unsigned char )*first ) ) ++first;
    
    const char *last = first + strlen( first );
    
    while ( last != first && isblank( ( unsigned char )last[-1] ) ) --last;

    size_t n = last - first;
    
    char * result = malloc( n + 1 );
    
    if ( result != NULL )
    {
        memcpy( result, first, n );
        result[n] = '';
    }
    
    return result;
}

int main(void) 
{
    const char *s = " a b ";
    
    printf( ""%s"
", s );
    
    char *p = trim( s );
    
    printf( ""%s"
", p );

    free( p );
    
    return 0;
}

程序输出为

" a b "
"a b"

在函数中,而不是这个While循环

while ( isblank( ( unsigned char )*first ) ) ++first;

您可以将函数strspn用作

first += strspn( first, " 	" );

这篇关于TRIM函数是否将内存大小减半以删除空格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆