TRIM函数是否将内存大小减半以删除空格? [英] trim function halve the memory size to remove the whitespaces?
本文介绍了TRIM函数是否将内存大小减半以删除空格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我必须创建一个可以执行此任务的函数(Trim函数):获取一个以空结尾的字符串,如果该字符串的第0位有空格,则删除该空格。如果空格在字符串的末尾(在零终止符之前),情况也是一样。因此,该函数基本上忽略了字符串中间的空格。
这是我到目前为止尝试做的事情, (1)我将";a b";字符串传递给Trim函数。 (2)(空指针检查)。 (3)使用strlen函数获取字符串的长度。
错误是这样的:当调试器运行for循环的第一行时,它会像预期的那样进入循环中;好的,这很好,但是当调试器运行if检查时,它应该是真的(因为在字符串的开头有一个空格),并且函数应该在if主体的第一个if语句中,并重新分配内存。但事实并非如此,因为realloc从不执行。为什么?(4)(这是微妙的部分,因为逐行调试我发现了一个 For循环内的奇怪错误)。
(该函数必须返回指向重新分配的内存的指针)。
另一个错误是";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屋!
查看全文