2016-02-09 113 views
-4

我的目的是从无符号字符数组复制到无符号字符数组。下面的示例代码可以解释从无符号字符复制到无符号字符

#include <stdio.h> 
#include <string.h> 

typedef struct _demo 
{ 
    unsigned char something[6]; 
}demo; 

typedef struct _Demo 
{ 
    demo d; 
}Demo; 

typedef struct _copy 
{ 
    unsigned char do_something[6]; 
}copy; 

int main() 
{ 
    copy *c = new copy; 
    Demo d1; 

    for(int i = 0; i < 6; i++) 
    { 
     c->do_something[i] = i; 
     printf("%u", c->do_something[i]); 
     strncpy(d1.d.something[i], c->do_something[i], sizeof(d1.d.something)); 
    } 


    return 0; 
} 

输出我得到的是:

In function 'int main()': 
28:33: error: invalid conversion from 'unsigned char' to 'char*' [-fpermissive] 
In file included from 2:0: 
/usr/include/string.h:132:14: note: initializing argument 1 of 'char* strncpy(char*, const char*, size_t)' 
extern char *strncpy (char *__restrict __dest, 
     ^
28:53: error: invalid conversion from 'unsigned char' to 'const char*' [-fpermissive] 
In file included from 2:0: 
/usr/include/string.h:132:14: note: initializing argument 2 of 'char* strncpy(char*, const char*, size_t)' 
extern char *strncpy (char *__restrict __dest, 

我想避免:

d1.d.something[i] = c->do_something[i]; 

请建议如何进行........ ...

+3

我看到'复制* C =新副本;在你的代码'。请注意,C和C++是不同的语言。 –

+2

你用'd1.d.something [i]'作为参数调用strncpy,它是一个'char',而不是'char *'。 'strncpy'接受一个指针作为参数,而不是char。 –

+0

我注意到David,但我想知道另一种方式 –

回答

0

警告和错误的原因是strncpy()接受char *参数whi ch不同于unsigned char *

假设在结构两个数组大小都一样简单地做

memcpy(d1.d.something, c->do_something, sizeof(d1.d.something)); 

如果您不能承担两个数组的大小相同,你需要编写代码来检查和限制根据复制。 memcpy()<string.h>中声明。

还要注意,运算符new是C++,即使您正在做的其余部分是香草C,我的答案也是如此。在C中,使用 - 在<stdlib.h>中声明 - 取而代之。完成后记得释放内存(使用free())。

1

这个问题是标记C++,并且使用new(一个C++操作),所以我想你想了解C++,不C,对不对?

// make sure the memory gets released when the 
// pointer goes out of scope 
// (requires #include <memory>) 
std::unique_ptr<copy> c(new copy); 

// fills the elements of c->do_something with 
// sequentially increasing values, starting with 0 
// (requires #include <numeric>) 
std::iota(std::begin(c->do_something), std::end(c->do_something), 0); 

// copies from c->do_something to d1.d.something 
// (requires #include <algorithm>) 
std::copy(std::begin(c->do_something), std::end(c->do_something), std::begin(d1.d.something)); 

采用std::begin()std::end()(其允许处理等的容器的阵列)需要#include <iterator>

参考文献:

相关问题