#include <iostream>
using namespace std
#include <string.h>
int main(){
char token[] = "some random string";
char c[23];
strcpy( c, token);
strncpy(c, token, 5);
c[strlen(c)] = '\0';
cout<<c;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
我的输出是:some random string.但我希望它是:some.任何人都可以解释为什么它的行为像这样?
我在这里不知所措.将在短时间内发布我的代码...只是它太长了,无法提取部分"令人不安"的代码.将expalin我的问题:我在一个结构数组中存储一个字符串(文件或目录的路径),{ char *path; size_t path_len}其中path是字符串path_en及其长度.在插入path_lenis 76时.从数组中提取strncpy字符串长度变为78或甚至数组中的字符串的简单strlen说77.
原始字符串长度小于77的所有其他情况都可以正常工作.
我很困惑.
我试图实现 strcpy 或 strncpy 并且无论我使用哪个都显示错误。
错误仅在 strncpy 和 strcpy 下
项目.cpp:
#include "Item.h"
#include <iomanip>
#include <iostream>
#include <ctime>
#include <string>
using namespace std;
#include "Date.h"
#include "POS.h"
#include "PosIO.h"
namespace sict {
Item::Item(){
_name = '\0';
_price = 0;
_taxed ='0';
_quantity = '\0';
}
Item::Item(const char* sku, const char * name, double price, bool taxed){
strNcpy(_sku, sku, MAX_SKU_LEN);
name = new char[20];
strcpy(_name, name);
_quantity = 0;
price = _price;
if (price = '\0') {
_taxed = true; …Run Code Online (Sandbox Code Playgroud) 我是C++初学者.
当我学习C++类时,这个示例代码不起作用.
此代码被NameCard类构造函数中的strncpy_s()func中断.
我试过调试,但我找不到原因.
你可以帮帮我吗?这是完整的源代码
祝你今天愉快.
NameCard(char *name, char *phone, char *company, char *position)
{
this->name = new char(strlen(name) + 1);
this->phone = new char(strlen(phone) + 1);
this->company = new char(strlen(company) + 1);
this->position = new char(strlen(position) + 1);
strncpy_s(this->name, strlen(name) + 1, name, strlen(name));
strncpy_s(this->phone, strlen(phone) + 1, phone, strlen(phone));
strncpy_s(this->company, strlen(company) + 1, company, strlen(company));
strncpy_s(this->position, strlen(position) + 1, position, strlen(position));
}
Run Code Online (Sandbox Code Playgroud) 这是我程序中的函数原型:
void FindRepStr(char str[], const char findStr[], const char replaceStr[]);
它发现findStr[]在str[]与更换replaceStr[].
这是我的代码:
void FindRepStr(char str[], const char findStr[], const char replaceStr[])
{
char *s = nullptr;
s = strstr(str,findStr); //s points to the first-time appear in str
char tmp[] ="";
//length equal
if(strlen(findStr)==strlen(replaceStr))
{
for(int i=0;i<strlen(findStr);i++)
{
if(replaceStr[i]=='\0' || s[i] =='\0')
break;
else
s[i] = replaceStr[i];
}
cout<<str<<endl;
}
else
{
//find shorter than replace
if(strlen(findStr)<strlen(replaceStr))
{
//!!!problem here!!!
strncpy(tmp,s,strlen(s)+1); // store the left …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚这个程序有什么问题.我试过用
strncpy(text,array[ ],sizeof(text))
Run Code Online (Sandbox Code Playgroud)
已经但是没有解决任何问题.我需要的是一种复制字符串的简单方法,如pascal语言,其中可以使用简单的等号来复制字符串(或者可以执行此操作的生成函数).这是源代码:
#include <stdio.h>
#include <string.h>
int x,y;
char array[10][10];
int choice;
char text[5];
int main()
{
for(x=0;x<5;x++)
{
printf("ENTER text: ");
scanf("%s", text);
strcpy (text,array[x]);
}
for (y=0;y<5;y++)
{
printf("\n");
printf("%s", array[y]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出应该是这样的;
"*string*"
"*string*"
"*string*"
"*string*"
"*string*"
Run Code Online (Sandbox Code Playgroud)
但我得到的是五个空格,没有字符串.任何方案?
我知道网上有很多答案,说一个比另一个更好,但我已经明白,strncpy()在防止由于缺失而导致系统不必要的崩溃方面更好'\0'.正如许多人所说,这是非常防御性的.
我已经浏览过这个链接:为什么要使用strncpy而不是strcpy?
让我们说:
char dest[5];
char src[7] = "Hello";
strncpy(dest, src, sizeof(dest)-1);
Run Code Online (Sandbox Code Playgroud)
有了这个实现(密钥sizeof(dest)-1总是为'\0'附加提供空间),即使目标有一个截断的字符串,是不是总是更安全使用strncpy()而不是strcpy()?换句话说,我想明白了一会时,要使用strcpy()过strncpy()?
strncpy()当我们将较少数量的数据复制到较大的(编译时分配的)缓冲区时,是否会导致内存泄漏?换句话说,内存利用不足会被称为内存泄漏吗?
以下是我的代码
#define uk "ln"
int main()
{
char buffer[32];
strncpy(buffer,uk,sizeof(buffer));// IS it memory leak free?
// uk macro has 3 byte of size to
// hold the string but here the
// Attemp of 32 byte is made to copy
// from uk macro to buffer?
}
Run Code Online (Sandbox Code Playgroud)
上面的代码中是否有内存泄漏或错误?