c语言合并字符串concatenate,我用错了strcat()

2023-12-08 06:10

本文主要是介绍c语言合并字符串concatenate,我用错了strcat(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

评论列表

pAnic2014-4-7 11:28:00

re: 我用错了strcat()

其实这只是违背了一个简单的原则:

变量使用前要初始化。

pAnic2014-4-7 11:28:00

re: 乾坤一笑

事实上充分初始化还是必要的,因为这里用strcat,所以初始化第一个字节即可,但是假如用strncpy呢?

在代码的最初阶段,有必要用完整的,安全的,但是效率不高的手法对数据进行必要的初始化,只有当优化时,才有必要把那些影响效率的多余的代码清理掉。

还是那句话:“过早优化是一种罪”

乾坤一笑2014-4-7 11:28:00

re: 我用错了strcat()

/// vc6.0 source char* __cdecl strncpy(char* dest,constchar* source,

size_t count)

{char*start= dest;while(count&& (*dest++ = *source++))/* copy string */

count--;if(count)/* pad out with zeroes */while(--count)

*dest++ ='\0';return(start);

}

strncpy更加不需要对dest进行初始化了。虽然dest和source内含的字符长度相等的时候不会在dest的末尾加0,但这也正好证明了我的观点:要对库的实现很了解,就不会出错了。不要想当然的乱用库函数。

tongue_smile.gif

pAnic2014-4-7 11:28:00

re: 我用错了strcat()

字符串是个麻烦事~

清风雨2014-4-7 11:28:00

不知道可不可以这么说

在C或C++的函数库里,字符串的概念一定是一个以'\0'结尾的字符,而且'\0'和它以前的内容一起构成字符串。

在MSDN里面常看到一个说法叫NULL结尾的字符串,也就是说可以有非'\0'结尾的字符串。但是,看看C里,定义、使用,都是:字符串是由一组联系的字符以'\0'结尾构成的。

乾坤一笑2014-4-7 11:28:00

to 清风雨:

你看MSDN看的很细,可惜的是没有正确理解“NULL结尾的字符串”的含义。MSDN上所谓的Null-terminated string 其实就是着的是“以'\0'结尾的字符串”。要理解这个概念要说到三个方面:

一、NULL是什么?

纵观VC6.0的库代码,有22处定义了NULL宏,但是所有定义都是一模一样的:#undef NULL

#ifndef NULL

#ifdef __cplusplus

#define NULL 0

#else /* __cplusplus */

#define NULL ((void *)0)

#endif /* __cplusplus */

#endif /* NULL */

二、'\0'是什么?

'\0'是C语言定义的用'\'加8进制ASCII码来表示字符的一种方法,'\0'就是表示一个ASCII码值为0的字符。同样的,你用'\x0'来表示也可以,这是用16进制的ASCII码来表示,虽然很不常见。

三、0值的意义何在?

0是一个整数。由于各种标准转换,0可以被用于作为任意整型、浮点类型、指针。0的类型将用上下文来确定。典型情况下0被表示为一个适当大小的全零二进制位的模式。所以,无论NULL是定义为常数0还是((void *)0)这个零指针,NULL都是指的是0值,而不是非0值。而字符的'\0'和整数的0也可以通过转型来相互转换。

综上所述,NULL就是指的是0值,Null-terminated string就是以0值结尾的string,也就是以'\0'。其实C语言中的变量只有4中char、int、float、poiner四大类。所谓的字符串只是一堆char的后面加上一个0而已。

清风雨2014-4-7 11:28:00

或许是我没说清楚

我想想微软既然那么说。也就表示,可以比如用其它的结束标识符号表示字符串。(不知道微软是不是这个意思)

但是,事实是:字符串是由一组有联系的字符以'\0'结尾构成的。

所以,你strcap时,要传递的buf,应该是一个字符串,也就是必须以'\0'结尾。那么我就没有细看你的文章了。也就表示每种实现其实都是结果一致的。

正确的一致,错误,不一定要错的一样。^_^

呵呵,那就是说,我个人觉得这贴的讨论意义不大。(仅仅是个人见解)

我比较懒惰,所以不提倡详尽到要看每个库的细节实现。而赞同透明使用,各司其职。

乾坤一笑2014-4-7 11:28:00

to 清风雨 :

晕倒!看来咱们俩之间确实误会不小。偶表达能力差,又不善解人意。:p

规矩是人定的,当然可以有其他的方法表示字符串。历史上FORTRAN一脉的强编译型语言表示字符串大体有两种方法:1>类C语言使用'\0'来终止字符数组;2>pascal之类的语言,用一个表示字符串长度的量捆绑到字符串上。两者各有千秋。但总体来说在于使用的人。

你们没有仔细看偶的文章,自然觉得意义不大。我的这篇blog是借题发挥,寓意并非研究strcat()这么肤浅。当然,寓意是什么,我相信仔细看过这篇文章的人都知道。

开发领域不同,自然对软件工程师的要求也自然不一样:本文针对的是系统级开发的软件工程师说的,在这个领域里效率是第一位,效率和安全要兼顾。至于上层的开发人员,我也认为没必要了解库细节——专注做业务逻辑就可以了,合理的软件构架才是他们需要关心的。

清风雨2014-4-7 11:28:00

是我不知道pascal的表示

一直很奇怪微软为什么那么说。 而且有个同事把字符串的概念也混了。

而又觉得混了,在C里面行不通。

所以,跑过来说了一下,好像字符串必须以'\0'结尾。

我看上面的VC6、gcc、linux的实现是没有差异的。—— 俺可能对VC71这种编译器的优化太信任了。而且太过相信0.0001ms和0.1ms如果不是频繁累积的,对程序员或者用户都没有意义。

倒是《more effective c++》有个结论,我很赞同:不同的库实现之间的性能是有差异的,选择适当的库,对你程序的性能会有帮助。(但,并不一定要清楚内部实现,毕竟没有人愿意去把所有的工作自己再做一般,而且也没有那个精力)

是我表达能力不好!

俺不是来唱反调的,只是发表一下个人的读后感。

乾坤一笑2014-4-7 11:28:00

to 清风雨 :

欢迎发表读后感!本站特别欢迎发表读后感!Welcome to my blog!:p

我之所以贴出那些实现也是想说,这些实现都一样的。这些实现都没有对strcat(dst,src)中的dst参数进行检查就开始操作了。所以我们要小心。

另外,0.1ms对我来说是至关重要的,0.01ms对我来说也是不能小觑的。这段代码的原本用于trace一个LCD的驱动的,我要trace出每一个点的值来确认LCD buffer是否被其他因素干扰致使画面局部显示不正常。假设每一个点要delay 0.1ms的话,整个LCD有128*160个点,就要delay 0.1ms * 128 * 160 = 2048ms,想想看,当你的画面每刷新1次,就需要等待2048ms是一个什么样的情形?:) 所以我说开发领域不同要求也不同,是真心话。我没有看过任何一个LCD厂商的驱动参考设计中使用 x/2的方法来计算x的一半是多少,它们都是用x>>2来计算,而这点效率的差别对普通上层开发来说是无关紧要的,但是对于底层驱动开发来说体现出的就是整个产品品质的差异了。

清风雨2014-4-7 11:28:00

呵呵,不继续下去了

如果不是频繁累积的 ^_^ (其实,大多问题大家其实都是一致的,关键看怎么引导和一个度的问题。)

顺便,就像指针检查一样,除了非NULL,C/C++基本无能为力。这就是C/C++所要做的,它把责任交给程序员,让程序员获取自己想要的性能和安全(不检查,可以相对减少开销:内存+运算)。

字符串也是一样,除了往后面找'\0',它没有别的办法。

或者,要么就传递数组,数组是要有长度的(免得挑刺,数组引用,或者内存块指针+大小 这里都算)。

不知道我的顺便是否正确(个人是这么认为的,没有见过什么C/C++的设计者这么说,或许有大致相近的说法,但总也不能确定就是这样。所以,也就只是个人看法)。

乾坤一笑2014-4-7 11:28:00

re: 我用错了strcat()

okey, okey.

顺便介绍一下PASCAL的字符串用法:

var s : string;

pascal的字符串的索引是从1开始的,s[0]是什么?s[0]就是s这个字符串的长度。由于最早(dos下)字符串都是中的每个组成单元都是一个字符,也就是8位的char,所以s[0]的大小受陷于2^8=256,也就是说早起的pascal的string的长度不能超过256。不过到了windows之后就好了,object pascal把字符串前导字节增加为32位,也就是说字符串的最大长度为2^32=4294967296,所以一般来说这个字符串长度还是够用了。Null-terminated字符串的好处是字符串不受长度的限制,这对于将底层操作统一为串操作有极大的好处(比如Linux下把所有的设备都映射为文件,可以用串操作函数来处理);有长度的字符串也有很多好处,因为它得到整体字符串长度的开销很小,所以它很容易就获得了做静态检查、越界检查的能力。

清风雨2014-4-7 11:28:00

长见识了! 谢谢!

以前一直不知道Null-terminated字符串是什么意思。

现在总算明白了。

非常感谢!

jzhang2014-4-7 11:28:00

如果楼主使用lint检查您的c/c++代码

这样的问题根本就不会出现,也用不着费尽心机的去调试了。推荐使用lint检查代码.

乾坤一笑2014-4-7 11:28:00

to jzhang :

并非所有的C编译器都提供lint的,偶用的C编译器组来gdb之类的工具都没有。在特定的硬件平台下,编译器是没法自由选择的,商用的嵌入式系统尤是如此。:)

gggg2014-4-7 11:28:00

这里其实不必要用strcat()

增加个

int offset=0;

即可:

for ( i=0; i

{

sprintf(buf + offset, "0x%.4X,", i);

offset += 7;

if (count++ == 9)

{

//print result, output to standard io stream for samulation.

printf("%s\n", buf);

offset = 0;

count = 0;

}

}

aydge2014-4-7 11:28:00

re: 我用错了strcat()

使用变量先初始化是基本的要求吧?

cpunion2014-4-7 11:28:00

re: 我用错了strcat()

我觉得这算是标准委员会那些人的失误(库函数原型是他们定的吧?)。

这些函数原型就有些问题,我是很难明白返回一个char*有何意义,不如返回一个int或size_t作为长度来得实在,这个长度在内部循环时就已经得到了,作为返回值可以省得我们再获取长度,也方便我们直接加个\0,还不需要库函数帮我们把剩余缓冲区填满\0这种低效的作法。

char* strncat (char* dst, const char* src, size_t len);

改为:

int strncat (char* dst, const char* src, size_t len);

返回个char*作什么?鼓励坏习惯吗?(strcat(strcat(buf,"abc"), "def");这种坏习惯)。

cpunion2014-4-7 11:28:00

re: 我用错了strcat()

当然了,你原来使用的那个错误是值得狠狠批评的,C字符串操作函数都会去找\0结尾的,所以初始化时刻不能忘了。。。。如果缓冲区不是很大,我觉得用memset全部初始化掉也没什么,效率低一点,不过省了很多事。当然我自己使用时不会这么干 :-)

满头大汗2014-4-7 11:28:00

re: 我用错了strcat()

看了两个低手在这里讨论,真搞笑。用字符串不初始化,这种低级错误还好意思写。你说你看库的实现,你才看了几个

操作系统啊?不同的操作系统实现都不一样,关看个VC和glibc就以为很了解了。居然也敢说标准委员会失误,你是不是

只用过Windows平台啊。

The strcat() function appends a copy of the string pointed to by the s2 parameter (including the

inating null byte) to the end of the string pointed to by the s1 parameter. The initial

byte of s2 overwrites the null byte at the end of the string pointed to by s1.

When operating on overlapping strings, the behavior of this function is unreliable.

这是Tru64下关于strcat的说明,写得这么详细了,还用得着你在这里猜啊。

乾坤一笑2014-4-7 11:28:00

to 满头大汗:

真是大牛!最起码比偶牛,哈哈。

乾坤一笑2014-4-7 11:28:00

to 满头大汗:

大牛!你有没有什么书、blog、或专场论坛之类的让偶们学习一下?

to 满头大汗2014-4-7 11:28:00

re: 我用错了strcat()

把你的blog贴出来吧,我们保证用口水淹没它。用过True64就牛啦,你没见过的多了,哪有像你这样招摇的“高手”。

兄弟们,偶是小三 :)

漫天飞舞2014-4-7 11:28:00

大家这么热闹,我也凑一个,不过就不说其他的了,很明确:

大家这么热闹,我也凑一个,不过就不说其他的了,很明确:如果是底层开发,就要效率第一了,如果是应用层开发,那么就代码风格第一了。再争吵的就有点。。。。。sb的干活了!

btw:一笑这里估计大意了吧,你也看看你的这个‘bug’,我就不说了。

‘我没有看过任何一个LCD厂商的驱动参考设计中使用 x/2的方法来计算x的一半是多少,它们都是用x>>2来计算,而这点效率的差别对普通上层开发来说是无关紧要的,但是对于底层驱动开发来说体现出的就是整个产品品质的差异了。’

一笑2014-4-7 11:28:00

to 漫天飞舞:

汗!你看的真细。叶子,以后专职帮偶校稿好了~~ :D

---

正确的是x/2 可以用右移一位来得到, 即x>>1

我最菜2014-4-7 11:28:00

to 翁翁

是这样

char buff[512] = {0}

一笑2014-4-7 11:28:00

re: 我用错了strcat()

最简单的,vc安装盘目录下有个CRT的目录,里面就是vc自带的C/C++库的源代码。

lance2014-4-7 11:28:00

re: 我用错了strcat()

还真是来,可算开眼了,呵呵

那Linux和GNU libc的那些从哪儿能下到啊?最好说的具体点,让我能点击下载,呵呵,实在是太菜了~~

谢谢昂

luomingjian2014-4-7 11:28:00

re: 我用错了strcat()

这些函数原型就有些问题,我是很难明白返回一个char*有何意义,

char* strncat (char* dst, const char* src, size_t len);

改为:

int strncat (char* dst, const char* src, size_t len);

返回个char*作什么?鼓励坏习惯吗?(strcat(strcat(buf,"abc"), "def");这种坏习惯)。

--------------------------

同问!

-------------------------

Joel也提到过这个问题, P5-P9。但我一直相信写库代码的人是牛,不会仅仅为了(strca(strcat(buf,"abc"), "def")而改变返回值类型,他的本意就是是什么?盼指点!

luomingjian2005@yahoo.com.cn

luomingjian2014-4-7 11:28:00

re: 我用错了strcat()

顺便提一下,俺是搜索C++98标准和C99 而发现的这块宝地。

乾坤一笑有中文文档啊,英文的也行?

中文的俺可以一目十行,英文的俺只能十目一行:)

luomingjian2005@yahoo.com.cn

秋枫2014-4-7 11:28:00

re: 我用错了strcat()

取1/2是右移一位啊,怎么移两位。。。

关于关注库函数的实现,个人觉得,没必要争论。有的时候,底层了解的太多了,反而更糊涂了。

标准化的目的,也是为了减少人对底层的关注。

本人系伪程序员,就是鉴定完毕,准予结贴。。。。

透明de面具2014-4-7 11:28:00

re: 我用错了strcat()

luomingjian

这些函数原型就有些问题,我是很难明白返回一个char*有何意义,

char* strncat (char* dst, const char* src, size_t len);

改为:

int strncat (char* dst, const char* src, size_t len);

返回个char*作什么?鼓励坏习惯吗?(strcat(strcat(buf,"abc"), "def");这种坏习惯)。

--------------------------

同问!

-------------------------

Joel也提到过这个问题, P5-P9。但我一直相信写库代码的人是牛,不会仅仅为了(strca(strcat(buf,"abc"), "def")而改变返回值类型,他的本意就是是什么?盼指点!

这个的目的就只是为了串式表达式的需要。没有别的了

去看看《高质量c++编程指南》这个书,里面有提到

strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?

答:为了实现链式表达式。

例如   int length = strlen( strcpy( strDest, "hello world") );

这样是很坏的习惯莫?我不这样看。

如果需要高效的情况下,

int length = strlen( strcpy( strDest, "hello world") );

应该会比

strcpy(strDest, "hello world");

int length = strlen(strDest);

要略快一些

sd2014-4-7 11:28:00

请教一下.

"使用 x/2的方法来计算x的一半是多少,它们都是用x>>2来计算,"

10的二进制码:00001010 右移三位,10>>3,10/8应该是:1.25是不?

但是移位后的二进制码等于1.25吗?

请教一下.

Prudence2014-4-7 11:28:00

re: 我用错了strcat()

建议楼主养成局部变量数组初始化的习惯,如果是全局数组的话就没必要初始化了,默认就是以0做为初值,这也是为什么一些C++书上讲的局部变量编译器不初始化(其实这里是错的,编译一样初始化的只是以0xCC),全局变量初始化为0。

void main()

{

int i;

cout<

}

观察下结构是否为0xCCCCCCCC

总的一局话,C++给局部变量以0xCC初始化,全局变量0初始化。

所以你如果在函数中声明数组的话,记住一定要调用memset函数,给该字符串数组进行初始化,这是一种习惯,一定要养成。

因为局部变量是在栈上分配的每个字节c++都是以0xCC来初始化的,并非0,而字符串的结尾是以0做为标志的,当然Unicode码不是这样的(Unicode码是在字符串的前四个字节编译器事先放入字符串长度,你可以随便找个VB的程序调试下)。

181996252014-4-7 11:28:00

re: 我用错了strcat()

其他的字符串操作也是需要注意一点的,例如sprintf().在有些时候对未初始化的字符串进行操作会导致编译的不通过.且如果不是集成环境下的编程,还不会给出出错的行数,只有通过记忆来查找......

fireswood2014-4-7 11:28:00

re: 我用错了strcat()

今天我也是用strcat出了错才来这里

大家好:)

char_file=(char*)malloc(sizeof(char)*n);

for(i=0;i

{

char_file[i]=*(argv0+i);

}//char_file的n个char字符空间被装满~

char_file[i]='\0';

strcat(char_file,"abc...");

程序在VC中可以编译通过,然后我拿去linux gcc编译执行

提示"段错误",后来知道了linux下strcat要求strcat(dst,src)dst大小可以容纳src,我的程序可以看出是将src加在dst(malloc产生的空间)后面,故而出错

但是请问,为什么VC中就可以执行呢?

个人猜测和weindows和linux堆管理策略有关,具体为何不知道。

还有看了楼主的帖子Linux 2.4.26 和GNU glibc实现不同

有点迷茫:

既然Linux 2.4.26 已经实现了strcat

然后我们如果安装GNU glibc的话,

我们编程的话,那编译器会使用那种实现?

(我对GNU glibc的理解是glibc是gcc编译器使用的库函数,不知对不?)

还有个问题*_*

char_file[i]='\0';

这一句如果没有,

那么char_file通常会为c:/x/x/    abc...

有的话是c:/x/x/abc...,没有那几个空格

(c:/x/x/ 代表一个路径,abc...代表字符串)

请问为何

*_*

fireswood2014-4-7 11:28:00

re: 我用错了strcat()

今天我也是用strcat出了错才来这里

大家好:)

char_file=(char*)malloc(sizeof(char)*n);

for(i=0;i

{

char_file[i]=*(argv0+i);

}//char_file的n个char字符空间被装满~

char_file[i]='\0';

strcat(char_file,"abc...");

程序在VC中可以编译通过,然后我拿去linux gcc编译执行

提示"段错误",后来知道了linux下strcat要求strcat(dst,src)dst大小可以容纳src,我的程序可以看出是将src加在dst(malloc产生的空间)后面,故而出错

但是请问,为什么VC中就可以执行呢?

个人猜测和weindows和linux堆管理策略有关,具体为何不知道。

还有看了楼主的帖子Linux 2.4.26 和GNU glibc实现不同

有点迷茫:

既然Linux 2.4.26 已经实现了strcat

然后我们如果安装GNU glibc的话,

我们编程的话,那编译器会使用那种实现?

(我对GNU glibc的理解是glibc是gcc编译器使用的库函数,不知对不?)

还有个问题*_*

char_file[i]='\0';

这一句如果没有,

那么char_file通常会为c:/x/x/    abc...

有的话是c:/x/x/abc...,没有那几个空格

(c:/x/x/ 代表一个路径,abc...代表字符串)

请问为何

*_*

zzq2014-4-7 11:28:00

re: 我用错了strcat()

我看了所有的帖子。用了一个多小时,觉得强人好多啊,

顶!

whh2014-4-7 11:28:00

re: 我用错了strcat()

用'\0'来结束字符串,简直愚蠢至极,不知道当初怎么定义的。

乾坤一笑2014-4-7 11:28:00

to whh //re: 我用错了strcat()

我觉得这个定义非常的明智。

一笑2014-4-7 11:28:00

to future //re: 我用错了strcat()

如果数组比较大的话,用memset太费时间。

again2014-4-7 11:28:00

re: 我用错了strcat()

第一次看的时候能够看出这个问题。但是自己写代码的时候就会犯这样的问题了。

纪念一下.

solo2014-4-7 11:28:00

re: 我用错了strcat()

谢谢你的这篇BLOG~~~获益匪浅啊!!

he2014-4-7 11:28:00

re: 我用错了strcat()

也是linux gcc 时用strcat时出错:段错误。

看了很久,学习了:)

伪系统程序员2014-4-7 11:28:00

re: 我用错了strcat()

看了大牛们的发言,只能叫自己伪系统程序员了!

大牛在热闹讨论问题的时候,小伪才刚刚工作!受教了!!!

12014-4-7 11:28:00

re: 我用错了strcat()

cpunion

我觉得这算是标准委员会那些人的失误(库函数原型是他们定的吧?)。

这些函数原型就有些问题,我是很难明白返回一个char*有何意义,不如返回一个int或size_t作为长度来得实在,这个长度在内部循环时就已经得到了,作为返回值可以省得我们再获取长度,也方便我们直接加个\0,还不需要库函数帮我们把剩余缓冲区填满\0这种低效的作法。

char* strncat (char* dst, const char* src, size_t len);

改为:

int strncat (char* dst, const char* src, size_t len);

返回个char*作什么?鼓励坏习惯吗?(strcat(strcat(buf,"abc"), "def");这种坏习惯)。

----------------------------------------------------

根据我的理解,楼上的函数定义是有问题的,请问返回值在哪里?

anonymous2014-4-7 11:28:00

re: 我用错了strcat()

这么简单的bug一眼就看出来了,楼主怎么还犯这种错

Soros2014-4-7 11:28:00

re: 我用错了strcat()

都是一些很小的细节,养成良好的编程习惯才能避免这样的错误;

良好编程习惯的养成又需要大量的编程与出错次数,出错多了也就会修正自己的习惯;也许这就是一些人说“20年的编程经历才敢说精通C语言”的原因吧~

C语言真的是让人又爱又恨~

这篇关于c语言合并字符串concatenate,我用错了strcat()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/468797

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非