字符串拷贝问题

问题:把源字符串拷贝到目的字符串,如果指定关键字,则以该关键字结束(不包括关键字本身),如果拷贝失败,则得到空串。
具体要求:实现如下函数原型SafeStrcpy2KeyWord(),并在代码中调用该函数实现上述功能。该函数的实现要考虑各种可能的参数取值,以确保程序不出现崩溃。

int SafeStrcpy2KeyWord(char* pDestBuffer,    //拷贝的目的地地址

char* pSourceString,    //拷贝的源地址

int nDestBufferSize,    //拷贝的目的地缓冲区长度

char* szKeyWord);    //指定关键字符串

返回值:所拷贝的字符串长度。如果拷贝失败,则返回0。

Input
输入包含多组数据,以EOF结束
每组数据第一行为不含空格的源字符串,长度小于256;接下来的一行或多行都是关键字串(长度小于16),一直到END结束。“NULL”表示关键字串为空,此时输出的拷贝后的长度应为0,拷贝后的字符串为空串(也用”NULL”表示,见下文)。

Output
对于每组数据输出拷贝的长度和拷贝后的目的字符串,以空格分隔。如果该目的字符串为空,则用”NULL”表示。

Sample Input
/home/tony/work_server/1/rtest/relayer.out
/
/t
/1/r
.
NULL
END

Sample Output
0 NULL
5 /home
22 /home/tony/work_server
38 /home/tony/work_server/1/rtest/relayer
0 NULL

回答:

#include <iostream>
#include <string>
using namespace std;
int SafeStrcpy2KeyWord(char* pDestBuffer, //拷贝的目的地地址
         char* pSourceString, //拷贝的源地址
         int nDestBufferSize, //拷贝的目的地缓冲区长度
         char* szKeyWord); //指定关键字符串

int main() {
 freopen("in","r",stdin);
 char s1[300],s2[300],s3[300];
 int len;
 while(scanf("%s",s1) !=EOF)
 {
  while(scanf("%s",s2) && strcmp(s2,"END") != 0)
  {
   len = SafeStrcpy2KeyWord(s3,s1,300,s2);
   if(len == 0)
    printf("0 NULL/n");
   else
    printf("%d %s/n",len,s3);
  }
 }
 return 0;
}

int SafeStrcpy2KeyWord(char* pDestBuffer, //拷贝的目的地地址
         char* pSourceString, //拷贝的源地址
         int nDestBufferSize, //拷贝的目的地缓冲区长度
         char* szKeyWord) //指定关键字符串

{
 if(nDestBufferSize == 0 || strcmp(szKeyWord,"NULL") == 0)
 {
  return 0;
 }
 char *k = strstr(pSourceString,szKeyWord);
 if(k == NULL)
 {
  strcpy(pDestBuffer,pSourceString);
  return strlen(pSourceString);
 }
 if(k-pSourceString==0|| k-pSourceString > nDestBufferSize)
 {
  return 0;
 }
 int i;
 for(i = 0;i < k-pSourceString; i++)
 {
  pDestBuffer[i] = pSourceString[i];
 }
 pDestBuffer[i] = 0;
 return i ;
}

时间: 2024-08-18 18:17:51

字符串拷贝问题的相关文章

字符串拷贝函数strcpy写法_转

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->// CppReference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" using namespace std; /* * 说明:字符串拷贝版本1 * 参数:dest目标地址,src源地址 * 返回:返回拷贝好的地址:如果出错或者有重叠,无

虚怀若谷 字符串拷贝函数strcpy写法_转

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->// CppReference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" using namespace std; /* * 说明:字符串拷贝版本1 * 参数:dest目标地址,src源地址 * 返回:返回拷贝好的地址:如果出错或者有重叠,无

编写实现字符串拷贝函数strcpy()完整版

有个题目编程实现字符串拷贝函数strcpy(),很多人往往很快就写出下面这个代码. void strcpy( char *strDest,char *strSrc ) { while(( *strDest++ = * strSrc++) != '\0' );//逐个赋值字符串数组中的数据,知道字符串结束 } 其实仔细看看这个实现过程并不完美,严格来说非常不严谨,我们可以完善一下. char * strcpy( char *strDest, const char *strSrc )//将源字符串加

c语言:两种方法实现字符串拷贝strcpy

实现字符串拷贝strcpy 方法一: // 字符串拷贝函数的实现 #include<stdio.h> #include<assert.h> void my_strcpy(char *dest,  char *src)//src表示source源,dest目标 { assert(dest!=NULL); assert(src); char *ret = dest; while (*dest++ = *src++) { ; } return dest; } int main() { c

Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数

概述 随着流行的缓冲区溢出攻击的增加,越来越多程序员开始使用带有大小,即有长度限制的字符串函数,如strncpy() 和strncat() .尽管这种趋势令人十分鼓舞,但通常的标准C 字符串函数并不是专为此而设计的.本文介绍另一种直观的,一致的,天生安全的字符串拷贝API . 当函数 strncpy()和 strncat()作为 strcpy()和 strcat()的安全版本来使用时,仍然存在一些安全隐患. 这两函数以不同的,非直观的方式来处理NUL 结束符和长度参数,即使有经验的程序员也会混淆

makefile规则编写&amp;C语言字符串拷贝&amp;vim介绍

makefile规则:[email protected]:目标文件$^:所有的依赖文件$<:第一个依赖文件-c:输出目标代码,不输出可执行文件-g:编译器编译的时候提供以后对程序调试的信息target:rules    gcc -o [email protected] $^install:    cp target /usr/local/binclean:    rm target    lib库查找方法:nm -o /lib/*.so | grep "函数名字" nm -o /

C++内存问题大集合(指针问题,以及字符串拷贝问题,确实挺危险的)

作者:rendao.org,版权声明,转载必须征得同意. 内存越界,变量被篡改 memset时长度参数超出了数组长度,但memset当时并不会报错,而是操作了不应该操作的内存,导致变量被无端篡改 还可能导致内存越界的函数有memset.memcpy.memmove.strcpy.strncpy.strcat.sprintf等等 临时指针问题,std::string.wstring的c_str()是个临时指针 c_str()返回值是个char*/wchar_t*指针,这个数组的数据是临时的,当有一

关注C++细节——字面值初始化字符数组及字符串拷贝注意

char carr[] = "author:CSDN-iaccepted"; 此时,carr数组中元素的个数为21,最后一个位置用来存放空字符'\0'. 所以如果写成carr[21] = "author:CSDN-iaccepted";就是错误的. int clen = strlen(carr); int size = sizeof(carr); 这时候得到的clen = 21,size= 22.这就是因为strlen统计串中字符的个数,不计算最后的空字符,但是si

Com组件的内存分配和释放,CredentialProvider SHStrDup 字符串拷贝问题

一.简介 熟悉CredentialProvider的同学应该知道,他为一个Com组件,于是,在这里的内存分配(字符串拷贝)的一系列操作就要按照con的标准来. 二.Com组件的内存分配和释放 COM提供的任务内存分配器,通过IMalloc接口调用.此接口由CoGetMalloc返回.分配内存可以使用IMalloc::Alloc,释放可由IMalloc::Free完成. 为了简化COM库封装了3个API函数来用于内存的分配和释放,如下: void *CoTaskMemAlloc(ULONG cb)