barriers / 阅读 / 详情

strncpy()函数的功能

2023-07-30 03:11:23
共2条回复
coco

strcpy ,strncpy ,strlcpy地用法

好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。

但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。

1. strcpy

我们知道,strcpy 是依据 /0 作为结束判断的,如果 to 的空间不够,则会引起 buffer overflow。strcpy 常规的实现代码如下(来自 OpenBSD 3.9):

char *

strcpy(char *to, const char *from)

{

char *save = to;

for (; (*to = *from) != "/0"; ++from, ++to);

return(save);

}

但通常,我们的 from 都来源于用户的输入,很可能是非常大的一个字符串,因此 strcpy 不够安全。

2. strncpy

在 ANSI C 中,strcpy 的安全版本是 strncpy。

char *strncpy(char *s1, const char *s2, size_t n);

但 strncpy 其行为是很诡异的(不符合我们的通常习惯)。标准规定 n 并不是 sizeof(s1),而是要复制的 char 的个数。一个最常见的问题,就是 strncpy 并不帮你保证 /0

结束。

char buf[8];

strncpy( buf, "abcdefgh", 8 );

看这个程序,buf 将会被 "abcdefgh" 填满,但却没有 /0 结束符了。

另外,如果 s2 的内容比较少,而 n 又比较大的话,strncpy 将会把之间的空间都用 /0 填充。这又出现了一个效率上的问题,如下:

char buf[80];

strncpy( buf, "abcdefgh", 79 );

上面的 strncpy 会填写 79 个 char,而不仅仅是 "abcdefgh" 本身。

strncpy 的标准用法为:(手工写上 /0)

strncpy(path, src, sizeof(path) - 1);

path[sizeof(path) - 1] = "/0";

len = strlen(path);

3. strlcpy

// Copy src to string dst of size siz. At most siz-1 characters

// will be copied. Always NUL terminates (unless siz == 0).

// Returns strlen(src); if retval >= siz, truncation occurred.

size_t

strlcpy(char *dst, const char *src, size_t siz);

而使用 strlcpy,就不需要我们去手动负责 /0 了,仅需要把 sizeof(dst) 告之 strlcpy 即可:

strlcpy(path, src, sizeof(path));

len = strlen(path);

if ( len >= sizeof(path) )

printf("src is truncated.");

并且 strlcpy 传回的是 strlen(str),因此我们也很方便的可以判断数据是否被截断。

[* 一点点历史 *]

strlcpy 并不属于 ANSI C,至今也还不是标准。

strlcpy 来源于 OpenBSD 2.4,之后很多 unix-like 系统的 libc 中都加入了 strlcpy 函数,我个人在 FreeBSD、Linux 里面都找到了 strlcpy。(Linux使用的是 glibc,

glibc里面有 strlcpy,则所有的 Linux 版本也都应该有 strlcpy)

但 Windows 下是没有 strlcpy 的,对应的是strcpy_s函数

///////////////////////////////////////////////////////////////////////////

strncpy

原型:extern char *strncpy(char *dest, char *src, int n);

用法:#include <string.h>

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。

说明:

如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。

如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。

src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回指向dest的指针。

举例:

// strncpy.c

#include <syslib.h>

#include <string.h>

main()

{

char *s="Golden Global View";

char *d="Hello, GGV Programmers";

char *p=strdup(s);

clrscr();

textmode(0x00); // enable 6 lines mode

strncpy(d,s,strlen(s));

printf("%s/n",d);

strncpy(p,s,strlen(d));

printf("%s",p);

getchar();

return 0;

}

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

memcpy

原型:extern void *memcpy(void *dest, void *src, unsigned int count);

用法:#include <string.h>

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

举例:

// memcpy.c

#include <syslib.h>

#include <string.h>

main()

{

char *s="Golden Global View";

char d[20];

clrscr();

memcpy(d,s,strlen(s));

d[strlen(s)]=0;

printf("%s",d);

getchar();

return 0;

}

苏州马小云

参看c++ primer

相关推荐

strncpy的用法

#include<string.h>定义了俩数组;char str1[12];char str2[] = "hello world !";strncopy(str1, str2, n);n为给定的值,语句将str2的前n个拷贝到str1中,值得注意的是一定会拷贝n个,不管str1是否有足够大的空间,n个必须拷贝完成语句才结束!切记!!如果你恰好有一个定义分配的空间在它后面的话,你就很肯能个因为str1的溢出而覆盖掉你在那定义的变量的值,当然你那恰好有定义的概率想当的小!两个字:渺茫!! 可是也不一定哦,还是小心使用啦
2023-07-29 13:14:212

strncpy是否是全覆盖复制

不是。c语言中strcpy是部分覆盖,strcpy()函数拷贝之后,是将某一地址的字符串复制到另外一地址中,会将该地址中本身存在的字符串的一部分给覆盖掉。
2023-07-29 13:14:281

strncpy()函数的功能

char * strncpy(char *s1,char *s2,size_t n);  将字符串s2中最多n个字符复制到字符数组s1中,返回指向s1的指针。  注意:如果源串长度大于n,则strncpy不复制最后的""结束符,所以是不安全的,复制完后需要手动添加字符串的结束符才行。  Strcpy和Strncpy的区别- -   第一种情况:   char* p="how are you ?";   char name[20]="ABCDEFGHIJKLMNOPQRS";   strcpy(name,p); //name改变为"how are you ? "====>正确!   strncpy(name,p,sizeof(name)); //name改变为"how are you ? " ====>正确!   第二种情况:   char* p="how are you ?";   char name[10];   strcpy(name,p); //目标串长度小于源串,错误!   name[sizeof(name)-1]=""; //和上一步组合,弥补结果,但是这种做法并不可取,因为上一步出错处理方式并不确定  strncpy(name,p,sizeof(name)); //源串长度大于指定拷贝的长度sizeof(name),注意在这种情况下不会自动在目标串后面加""   name[sizeof(name)-1]=""; //和上一步组合,弥补结果  ================================================   总结:strcpy   源字串全部拷贝到目标字串中,包括"",但是程序员必须保证目标串长度足够,且不与源串重叠。  strncpy   如果目标长>=指定长>源长,则将源串全部拷贝到目标串,连同""   如果指定长<源长,则将截取源串中按指定长度拷贝到目标字符串,不包括""   如果指定长>目标长,错误!
2023-07-29 13:14:352

c语言 求strncpy函数原型

char* strncpy(char *dest, const char *src, size_t n){ size_t i; for (i = 0 i < n && src[i] != "" i++) dest[i] = src[i]; for ( i < n i++) dest[i] = ""; return dest; }
2023-07-29 13:14:542

c语言中,strncpy的返回值是什么?

可以级联操作。应该是地址。
2023-07-29 13:15:013

为什么 strncpy() 不能总在目标串放上终止符 ’’?

strncpy() 最初被设计为用来处理一种现在已经废弃的数据结构——定长, 不必 "" 结束的 “字符串”。strncpy 的另一个怪癖是它会用多个 "" 填充短串, 直到达到指定的长度。在其它环境中使用 strncpy() 有些麻烦, 因为必须经常在目的串末尾手工加 ""。可以用 strncat 代替 strncpy 来绕开这个问题: 如果目的串开始时为空 (就是说, 如果先用 *dest = ""),strncat() 就可以完成希望 strncpy() 完成的事情。另外一个方法是用 sprintf(dest, "%.*s", n, source)。如果需要复制任意字节 (而不是字符串), memcpy() 是个比 strncpy() 更好的选择。
2023-07-29 13:15:091

解释strcpy 和strncpy 的差别在哪里,各自的优缺点是什么

第一种情况:char* p="how are you ?";char name[20]="ABCDEFGHIJKLMNOPQRS"; strcpy(name,p); //name改变为"how are you ? OPQRS " ====>错误!strncpy(name,p,sizeof(name)) //name改变为"how are you ? " ====>正确!第二种情况:char* p="how are you ?";char name[20];strcpy(name,p); //name改变为"how are you ? 未知字符 " ====>错误!name[sizeof(name)-1]="/0" //和上一步组合,得到正确的结果!strncpy(name,p,sizeof(name)); //name改变为"how are you ? " ====>正确!第三种情况:char* p="how are you ?";char name[10];strcpy(name,p); //name改变为"how are yo" ====>无结束符"/0",错误!name[sizeof(name)-1]="/0" //和上一步组合,弥补结果。但要注意,字符传递错误!strncpy(name,p,sizeof(name)); //和单纯的一步strcpy结果一样!总结:strcpy如果源长>目标长,则将源长中等于目标长的字符拷贝到目标字符串如果源长<目标长,则源长全部拷贝到目标字符串,不包括"/0"strncpy如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上"/0"如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括"/0"如果指定长>目标长,error happen!/***************************************************************************************************总结:strcpy(),以源串中的"/0"为拷贝结束标志,直到遇到该NULL为止,然后将NULL拷贝上.strncpy()以第三个参数N为拷贝结束标志,如果source的长度小于N,则剩余的字符全部用NULL填充. 如果source的长度大于N,则从source中截取前N个字符,拷贝过去
2023-07-29 13:15:162

strncpy(a,b+3,3)什么意思,a和b都是字符串

strncpy 是 C语言的库函数之一,来自 C语言标准库,定义于 string.h,char *strncpy(char *dest, const char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest 你这句话的意思是 因为b+3了所以是把b字符串第三个字符起后面三个字符复制到a比如b是123456789 那么复制之后是456到a
2023-07-29 13:15:231

C语言strncpy输出结果乱码,问题出在哪里?

strncpy是拷贝n个字符到目标字符数组里面,并不会在后面再自动加个字符串结束标志""。
2023-07-29 13:15:302

strncpy函数

你用char*name[]={"1...","2...","3...","4...","5...","6...","7...","8..."}的格式定义的name是个指针数组,其每一个元素都是一个char型指针,抽出第一个来看就是char*name[0]="1...",它的一般形式是char*p="abc..."。这种形式定义的指针是所谓“常指针”,p指向的内容*p是不允许写改变的!而你的strncpy(name[0],"Illegal",7)试图把Illegal的前7位写进name[0]指向的单元开始的空间去,是非法的,所以报错!用strcpy(name[0],"Illegal")同样是不行的。name[0]~name[7]都是常指针,都不能被strcpy()操作。改进的办法是:将char*name[]改为charname[][12]={"...","...",...},让name成为一个可以写操作的二维数组名就可以了。其中[12]是最长字符串Illegalday所需要的空间。供参考……
2023-07-29 13:15:491

关于c++ strncpy

一样的意思。问题出在:ch1是15+1个字符,但是只有5个赋值了,所以剩下的是乱码。
2023-07-29 13:15:574

strcpy和strncpy的区别

char*strncpy(char*strDest,constchar*strSource,size_tcount);char*strcpy(char*strDestination,constchar*strSource);两者功能基本一样。不同之处在于,strncpy多一个参数count,即复制的字节数
2023-07-29 13:16:041

C/C++中strcpy和strncpy的区别

strcpy 复制到字符串结束符为止。strncpy比strcpy多了一个参数n,当复制数量达到n或者遇到这两个都会导致复制结束。所以 strncpy可以确保不会溢出,更安全一些。
2023-07-29 13:16:191

为什么老说strncpy不安全啊

strncpy 比 strcpy更安全,或者可以选用 memcpy
2023-07-29 13:16:263

有关strncpy函数中n的问题。

strncpy 的第三个参数 n 的类型是 size_t, size_t 其实就是 unsigned int 无符号整数,因而不会出现是负数的情况。即使你给 n 赋的值是个负数, 如 -1,其实因为其类型是 unsigned int, 也等同于正数 2^32 -1 = 4294967295.
2023-07-29 13:16:411

解释strcpy 和strncpy 的差别在哪里,各自的优缺点是什么

strcpy 和strncpy 的差别在于:前者复制整个指定的字符串,后者只复制指定字符串中指定数目的字符。strcpy 比较简单,而使用strncpy 可以适当地控制复制字符的数目,因此比strcpy 更为安全。
2023-07-29 13:16:481

C语言的strncpy问题求解

你贴的代码不全,也没说bug是什么,别人怎么看?
2023-07-29 13:16:573

strncpy的用法问题

因为"wo3 "的3后面有个空格 而空格的ASCII就是32 而其最后应该是有一个回车吧 回车就是13
2023-07-29 13:17:151

C语言strncpy输出结果乱码,哪里出问题了?

strncpy(str1,str2,6);因为你只拷贝了三个字符
2023-07-29 13:17:243

strncpy用法 char buf[8]; ;strncpy(buf,“abcdefgh”+6,3)具体什么意思?

等同下段代码:const char * temp = "abcdefgh”;char buf[8]; ;strncpy(buf,temp+6,3);
2023-07-29 13:17:392

如何定义指针指向字符串中的一个字符

假如有char *p且p已指向一含有10个元素的字符数组,现有目标数组char b[10],则可以有三种函数可以实现字符串复制。1、strcpy语法格式: strcpy(目标地址,源地址)此例语法:strcpy(b,p);将源地址后的字符逐一复制到目标地址中,直到遇到结束符,如果源串中不含结束符就会造成目标数组越界。2、strncpy语法格式:strncpy(目标地址,源地址,字符长度)此例语法:strncpy(b,p,10);将源地址开始前n个(指定字符长度)字符逐一复制到目标地址中,不检测结束符也不检测边界,当指定长度大于目标数组长度则会越界。3、memcpy语法格式:memcpy(目标地址,源地址,字节长度)此例语法:memcpy(b,p,sizeof(char)*10);内存数据块复制,执行效率最高的一个。将源地址开始前n个(指定字符长度*字符的数据宽度)字节的内容复逐一复制到目标地址中,无视数组元素类型,只按字节复制,不检测数组边界,当指定长度大于目标数组长度则会越界。这里需要注意的是数组长度必须通过给定的元素类型获得数据宽度(sizeof(char))然后计算出实际的内存大小。
2023-07-29 13:17:491

strncpy中的数组1可以是一个字符串常量吗?为什么strcpy的数组1不能是字符串常量呢

修改字符串字面量是几个意思啊。。
2023-07-29 13:18:223

strncat strncpy 会不会自动添加

2023-07-29 13:18:302

C语言编程怎么将截断一个数组的一部分

可以考虑 strncpy 函数
2023-07-29 13:18:391

关于strcpy和strncpy的一些问题

是strcpy
2023-07-29 13:19:041

+谁给我说说 strcpy strncpy strcat strncat 区别别写百度的看不懂,详细点。初学c++

strcat是把两个字符串连接在一起,把第二个字符串接到第一个字符串的后面strncat是第二个字符串的前n位接到第一个字符串的后面strcpy是覆盖,即把第二个字符串覆盖到第一个字符串上(从第一个字符串的第一位开始替换成第二个字符串的内容)strncpy是把第二个字符串的前n位覆盖到第一个上
2023-07-29 13:19:111

c语言字符串处理函数有哪些

1、puts函数——输出字符串的函数  一般的形式为puts(字符串组)  作用:将一个字符串输出到终端。如,char一个string,并赋予初值。调用puts(string);进行字符串的输出。  2、gets函数——输入字符串的函数  一般的形式:gets(字符数组)  作用:从终端输入一个字符串到字符数组,并且得到一个函数值成为字符数组的起始地址。  gets(str);  键盘输入,,,,你懂得。  注意:puts和gets函数只能输出或者输入一个字符串。  3、strcat函数——字符串连接函数  一般的形式:strcat(字符数组1,字符数组2);  作用:把两个字符串数组中字符串连接起来,把字符串2连接到字符串1的后面。  说明:字符数组1必须足够大,以便容纳连接后的新字符串。  4、strcpy/strncpy函数——字符串复制函数  一般形式:strcpy(字符数组1,字符串2);  作用:将字符串2复制到字符数组1中去。  如:char str1[10],str2[]="DongTeng";  strcpy(str1,str2);  执行后的结果为:你懂得  注意:  1. 不能用赋值语句直接将一个字符串常量或者字符数组直接给一个字符数组。  2. 用strncpy可以赋值指定的位置的字符。strncpy(str1,str2,3);将str2中的第3个字符复制到str1中。  5、strcmp函数——字符串比较函数  一般形式:strcmp(字符串1,字符串2);  作用:用来比较两个字符串的差异。具有不同的比较规则。  6、strlen函数——测字符串长度的函数  一般形式:strlen(字符数组);  如:char str[10]="DongTeng";  printf("%d",strlen(str));  得到的结果是:5  7、strlwr函数——转换为小写的函数  一般形式:strlwr(字符串);  8、strupr函数——转换为大写的函数  一般形式:strupr(字符串)。
2023-07-29 13:19:351

c语言如何截取字符串的一部分

用strncpy函数,函数签名char * strncpy(char *dest, const char *src, size_t n);比如要是从src第2个字符开始截取3个字符,可以用strncpy(dest, src + 2 - 1, 3);
2023-07-29 13:19:421

C++ 以下程序运行结果,请教一下高手。

..................不会啊
2023-07-29 13:19:504

C++ strcpy()怎么用??

需要使用的是 strncpy这个可以指定拷贝字符的长度,指定源地址,目标地址,还有需要拷贝的字符的长度; strcpy只能传入两个参数,只指定拷贝的起始地址跟目标地址,然后整体拷贝。
2023-07-29 13:19:583

strncpy_s移植到Linux系统下可用吗?

windows上的这个源码是可以移植到linux下的 C库函数相对都不依赖于系统,不过你还得下载个SDK ,然后研究下它的代码,再写过去。
2023-07-29 13:20:151

C语言微软安全函数问题(strcpy()函数)

就是说,你可以接着使用strcpy这个函数,但是它在后续的CRT版本中将逐渐被弃用,所以最好使用安全版本的strcpy_s代替它,如果仍要使用,可以使用预编译宏_CRT_SECURE_NO_WARNINGS来屏蔽这个警告。关于strcpy_s的使用参考微软的文档说明:网页链接
2023-07-29 13:20:233

c语言中,strncpy的返回值是什么?

可以级联操作。应该是地址。
2023-07-29 13:20:503

strncpy出错

strncpy是字符串复制函数,对0x00有特殊处理,因为这个是字符串结束标记,在字符串出现0之后,后面的都不会复制,因此从source的第五位开始,后面的不会复制,因为你指定了6,因此后面都使用0填充。要完整复制内容,要么循环,要么用其它函数,忘了keil下面有没有memcpy函数,如果有,这个可以正确复制。
2023-07-29 13:20:572

strncpy_s怎么用的?

和strncpy的用法一致,只是提倡使用strncpy_s,这样更安全
2023-07-29 13:21:041

C语言如何将文件截断一半

读出来不要就行了啊假设你的文件是t1.txt,在d:存放,把前面两个字段存到另一个文件t2.txt里 #include int main(){ FILE* fpi, *fpo; char s1[30]; char s2[30]; char oo[30]; fpi=fopen("d:\t1.txt", "r"); if (!fpi) { printf("打开源文件失败"); return 555; } fpo=fopen("d:\t2.txt", "w"); if(!fpo) { printf("打开目标文件失败"); return 333; } while (!feof(fpi)) { fscanf(fpi, "%s%s%s", s1, s2, oo); fprintf(fpo, "%s %s ", s1, s2); //不要oo了 } fclose(fpi); fclose(fpo); return 0;}
2023-07-29 13:21:141

怎么把指针的字符串给数组

1. 如何把一个字符指针指向的字符串复制给字符数组 假如有char *p且p已指向一含有10个元素的字符数组,现有目标数组char b[10],则可以有三种函数可以实现字符串复制。 1、strcpy 语法格式: strcpy(目标地址,源地址) 此例语法:strcpy(b,p);将源地址后的字符逐一复制到目标地址中,直到遇到结束符,如果源串中不含结束符就会造成目标数组越界。 2、strncpy 语法格式:strncpy(目标地址,源地址,字符长度) 此例语法:strncpy(b,p,10); 将源地址开始前n个(指定字符长度)字符逐一复制到目标地址中,不检测结束符也不检测边界,当指定长度大于目标数组长度则会越界。 3、memcpy 语法格式:memcpy(目标地址,源地址,字节长度) 此例语法:memcpy(b,p,sizeof(char)*10); 内存数据块复制,执行效率最高的一个。将源地址开始前n个(指定字符长度*字符的数据宽度)字节的内容复逐一复制到目标地址中,无视数组元素类型,只按字节复制,不检测数组边界,当指定长度大于目标数组长度则会越界。这里需要注意的是数组长度必须通过给定的元素类型获得数据宽度(sizeof(char))然后计算出实际的内存大小。 2. 怎么将指针指向的字符串赋值给数组 #include<stdio.h> #include<string.h> char *copystr(const char*s1,char p1[100]) { int i=0; while(s1[i]!="") { p1[i]=s1[i]; i++; } p1[i]=""; return p1; } int main() { const char *s="hello! what are you doing?"; char p[100]; char *q; q=(char*)s;这句话直接把s的地址赋值给q copystr(s,p);这个是函数一个一个赋值 puts(p); puts(q); return 0; } 3. 如何把一个字符指针指向的字符串复制给字符数组 假如有char *p且p已指向一含有10个元素的字符数组,现有目标数组char b[10],则可以有三种函数可e799bee5baa6e58685e5aeb931333339666639以实现字符串复制。 1、strcpy语法格式: strcpy(目标地址,源地址)此例语法:strcpy(b,p);将源地址后的字符逐一复制到目标地址中,直到遇到结束符,如果源串中不含结束符就会造成目标数组越界。2、strncpy语法格式:strncpy(目标地址,源地址,字符长度)此例语法:strncpy(b,p,10);将源地址开始前n个(指定字符长度)字符逐一复制到目标地址中,不检测结束符也不检测边界,当指定长度大于目标数组长度则会越界。 3、memcpy语法格式:memcpy(目标地址,源地址,字节长度)此例语法:memcpy(b,p,sizeof(char)*10);内存数据块复制,执行效率最高的一个。将源地址开始前n个(指定字符长度*字符的数据宽度)字节的内容复逐一复制到目标地址中,无视数组元素类型,只按字节复制,不检测数组边界,当指定长度大于目标数组长度则会越界。 这里需要注意的是数组长度必须通过给定的元素类型获得数据宽度(sizeof(char))然后计算出实际的内存大小。 4. C语言中如果将一个指针所指向的字符串赋给数组 数组声明的时候就要指定大小的 可以用memcpy,对于字符串,也可以用strcpy或strncpy(需要包含string.h) 比如: char *p="abc"; char a[10]; memcpy(a,p,sizeof(a)); 或者 strcpy(a,p); 或者 strncpy(a,p,sizeof(a));/* 比上面的strcpy安全 */ PS:关于sizeof,取数组的时候是数组的大小,指针的话,32位机器,会是4,所以字符串指针不用sizeof取长度,用strlen(); 5. 怎么将指针得到的数据传递给数组 主要是指针数组与数组指针的区别 定义 int (*p)[n];这个是数组指针 ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。 也就是说执行p+1时,p要跨过n个整型数据的长度 定义 int *p[n];这个是指针数组 []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]。 p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
2023-07-29 13:21:201

求C语言编程:急用急用

城市名字是大写小写,还是自己判断啊?
2023-07-29 13:21:281

C结构体报错原因?

字符串赋值不能用等于,必须用strcpy(stu.name, "abcde");
2023-07-29 13:21:473

一道c语言菜鸟题

#include <stdio.h> #include <string.h> char* DeleteChar(char* delstring,int k, int m) { int nstrlen = strlen(delstring); char *returnstr = new char[nstrlen-m+1]; memset(returnstr,0,nstrlen-m+1); strncpy(returnstr,delstring,k); strncpy(returnstr+k,delstring+k+m,nstrlen-m-k); return returnstr; } int main() { char teststring[] = {"We are good students"}; char *getDelchar = DeleteChar(teststring,6,5); printf("%s ",getDelchar); delete getDelchar;while(1); }
2023-07-29 13:22:032

C语言中如何截取字符串的前几个字符?

方法没有错问题在于strncpy(b,a,6);执行之后没有在结尾处添加字符串结束标志
2023-07-29 13:22:245

编程最后显示结果too few actual parameters是什么意思?

错误提示:调用delist函数的时候,少了一个实参,所以把dellist(L,i);改为dellist(L,i, Item);//加个实参Item 就可以了。#include<stdio.h>#include<stdlib.h>#include<string.h>struct student{char stuxuehao[6]; int stuno1; int stuno2;int stuno3;int stuno4;} ;void PraseStuNO(student* stu){char sz[2]={0};strncpy(sz, stu->stuxuehao, 2);stu->stuno1 = atoi(sz);memset(sz,0,2);strncpy(sz, stu->stuxuehao + 2, 1);stu->stuno2 = atoi(sz);memset(sz,0,2);strncpy(sz, stu->stuxuehao + 3, 2);
2023-07-29 13:22:431

C语言中如何截取字符串的前几个字符?

方法没有错 问题在于 strncpy(b,a,6);执行之后 没有在结尾处添加字符串结束标志
2023-07-29 13:23:115

strcpy用于unsigned char *出错

.............strcopy的参数是char *给你个函数吧int StrCopyEx (void* pstFrom ,void* pstTo){if (pstFrom == NULL || pstTo == NULL)return -1 ;unsigned char* pstF = (unsigned char*) pstFrom ;unsigned char* pstT = (unsigned char*) pstTo ;while (*pstT++ = *pstF++) ;return 0 ;}当然memcopy才是王道其实你这样就行了#define STRCOPY(pstFrom ,pstTo) strcopy ((char*) (pstFrom) ,(char*) (pstTo))以后用STRCOPY
2023-07-29 13:23:491

#include #include class CPerson { public: void SetData(char *name,char *num,c

#include<iostream.h>#include<string.h>class CPerson{public: void SetData(char *name,char *num,char *sex) { int n=strlen(name)+1; //这里要注意:直接求字符串长度要比存储时少一个字节,导致乱码;下面两处相同 strncpy(pName,name,n); n=strlen(num)+1; strncpy(pNum,num,n); n=strlen(sex)+1; strncpy(pSex,sex,n); } void Output() { cout<<"姓名:"<<pName<<endl; // cin>>pName; 输出时没有这个必要 cout<<"编号:"<<pNum<<endl; // cin>>pNum; cout<<"性别:"<<pSex<<endl; // cin>>pSex; }private: char pName[20]; char pNum[20]; char pSex[20];};class CStudent:public CPerson{public: void SetPersonData(char *name,char *num,char *sex) { SetData(name,num,sex); } //这漏了个“}” void InputScore(double score1) { dbscore1=score1; } void print() { void Output(); cout<<"成绩"<<dbscore1<<endl; }private: double dbscore1;};void main(){ CStudent stu; stu.SetData("方世玉","168","男"); //你定义的函数里有三个参数,这里不能为空 stu.Output(); stu.InputScore(99.8); //这线面两行是对你派生类里面的内容的实现。 stu.print();}//不知你满意不?????
2023-07-29 13:23:561

用C语言怎么截取并计算一段字符串

float match(char *str1,char *str2){ int i=0,j=0; char b1[10]=""; char *s1=str1;//v11(123)v234(23.2)v345(321) char *s2=str2; strcat(s2,"(");//标识后插入"(" while((*s1!="")&&(j==0)) { if((*s1)==(*s2))//如果完整串第一个字符与字串字符相等 { i=0; while(*(s1+i)==*(s2+i))// { i++; } if(*(s2+i)=="")//全部匹配完 { while(*(s1+i)!=")") { b1[j]=*(s1+i); i++; j++; } } else { while(*s1!=")")//不匹配直接跳到下一组标识前的")" s1++; s1++;//指针指到下一个标识第一个字符 } } else { while((*s1)!=")")//不匹配直接跳到下一组标识前的")" s1++; s1++;//指针指到下一个标识第一个字符 } } return atof(b1);}
2023-07-29 13:24:052

求 用C语言 写一个取字符串后N位 的函数

char * right(char *dst,char *src, int n){char *p = src;char *q = dst;int len = strlen(src);if(n>len) n = len;p += (len-n);while(*q++ = *p++);return dst;}
2023-07-29 13:24:153

c语言中,有一个字符数组,怎么样取出一个子字符串,知道开始坐标和结束坐标

strstr
2023-07-29 13:24:362

如何编写函数,用C++语言实现将一个字符串插入到另一个字符串的指定位置,最好用指针指向字符串来实现?

2023-07-29 13:24:463

c语言 指向数组的指针问题,帮我找找怎么修改,尽量不要改太多,不然我看不懂。。。

结束符
2023-07-29 13:24:546