注册 登录
编程论坛 VC++/MFC

关于strncpy函数源代码 请问我的这个代码错在哪?

lateraware 发布于 2012-02-23 23:08, 1312 次点击
运行出来时乱码
#include <iostream>
using namespace std;

char *mystrncpy(char *str2, const char *str1, int n)
{
    int i = 0;
    char *dest = str2;
    while(*str1 != '\0' && i < n)
    {
        *str2++ = *str1++;
        i++;
    }
    return dest;
}

void main()
{
    char *p = "abcde";
    char *q = new char(20);
    char *w = mystrncpy(q,p,3);
    cout << w << endl;
    system("pause");
}


为什么下面这段代码也是错的?
#include <iostream>
using namespace std;

void main()
{
    char *p = new char[20];
    char *q = "abcde";
    strncpy(p, q, sizeof(q));
    cout << p << endl;
    system("pause");
}


[ 本帖最后由 lateraware 于 2012-2-23 23:31 编辑 ]
9 回复
#2
红色警戒2012-02-24 09:59
mystrncpy  最后要给字符串赋值\0,还有str1长度大于str2就会出问题。

[ 本帖最后由 红色警戒 于 2012-2-24 10:02 编辑 ]
#3
gb55439252012-02-24 11:26
明显没有复制 str2的 ‘/0’过去,  写成  
char *strncpy(char *dest, const char *src, size_t count)
{
    char *tmp = dest;

    while (count) {
        if ((*tmp = *src) != 0)
            src++;
        tmp++;
        count--;
    }
    return dest;
}
#4
gb55439252012-02-24 11:31
你二段代码用法错误啊, sizeof(q)的数值是5啊, 也就是你的n是5啊, 你没有算‘/0’进去啊, 应该改成strncpy(p, q, sizeof(q)+1);就对了啊, 不过按照我的习惯 会给在之前 bzero(p,20);先把p空间的内容都清零了,以免造成什么意外情况
#5
BianChengNan2012-02-24 11:55
以下是引用gb5543925在2012-2-24 11:31:56的发言:

你二段代码用法错误啊, sizeof(q)的数值是5啊, 也就是你的n是5啊, 你没有算‘/0’进去啊, 应该改成strncpy(p, q, sizeof(q)+1);就对了啊, 不过按照我的习惯 会给在之前 bzero(p,20);先把p空间的内容都清零了,以免造成什么意外情况
额,好像对指针进行sizeof结果都是4啊,(32位机子下面是这样的)可以测试的哈
#6
gb55439252012-02-24 12:12
回复 5楼 BianChengNan
是4 ,我疏忽了, 那个p和q搞混了, 对数组名 sizeof的话 是 数组的整体大小,他这个应该是 strlen(q)+1才对~ 我囧
#7
lateraware2012-02-25 00:01
回复 2楼 红色警戒
没错 出乱码的原因就是没有 '\0'
#8
lateraware2012-02-25 00:06
回复 6楼 gb5543925
是的 strlen这个用得好!呵呵
#9
lateraware2012-02-25 00:13
#include <iostream>
#include <cstdlib>
using namespace std;

char *mystrncpy(char *dest, const char *src, size_t count)
{
    char *tmp = dest;
    dest[count] = '\0';
    while (count) {
        if ((*tmp = *src) != '\0')
            src++;
        tmp++;
        count--;
    }
    return dest;
 }

int main()
{
    char *p = "abcde";
    char *q = new char[20];
    char *w = mystrncpy(q,p,3);
    cout << w << endl;
    system("pause");
    return 0;
}


#10
lz10919149992012-02-26 14:54
程序代码:
char* strncpy(char* to, const char* from, size_t count) {
    char* cp = to;
    while (*from && count--)
        *cp++ = *from++;
    *cp = '\0';
    return to;
}
1