C 0600在函数中是什么意思?与\200相同吗?
我正在尝试自己编写memccpy()函数。我会打电话给ft_memccpy()。 我在网上找到了测试主要功能,有两个测试功能让我感到困惑。 第一个测试函数适用于我的ft_memccpy(),但第二个测试函数不适用。 我不明白,因为test1和test2之间的唯一区别是\200被更改为0600 这是我制作的ft_memccpy:C 0600在函数中是什么意思?与\200相同吗?,c,ascii,octal,C,Ascii,Octal,我正在尝试自己编写memccpy()函数。我会打电话给ft_memccpy()。 我在网上找到了测试主要功能,有两个测试功能让我感到困惑。 第一个测试函数适用于我的ft_memccpy(),但第二个测试函数不适用。 我不明白,因为test1和test2之间的唯一区别是\200被更改为0600 这是我制作的ft_memccpy: void *ft_memccpy(void *dest, const void *src, int c, size_t n) { char *dptr
void *ft_memccpy(void *dest, const void *src, int c, size_t n)
{
char *dptr;
char *sptr;
dptr = (char *)dest;
sptr = (char *)src;
while (n && *dptr && *sptr)
{
*dptr = *sptr;
if (*sptr == c)
{
return (++dptr);
}
dptr++;
sptr++;
n--;
}
return (0);
}
这里是第一个测试函数(test1),我的函数在这里工作正常:
#include "ft_memccpy.c"
#include <stdio.h>
#include <string.h>
int main()
{
char dest[] = "abcdefghijklmnopqrstuvwxyz";
char dest2[] = "abcdefghijklmnopqrstuvwxyz";
char src[] = "string with\200inside !";
int n = 21;
memccpy(dest2, src, '\200', n);
printf("%s\n", dest2);
ft_memccpy(dest, src, '\200', n);
printf("%s\n", dest);
}
#包括“ft_memccpy.c”
#包括
#包括
int main()
{
char dest[]=“abcdefghijklmnopqrstuvwxyz”;
char dest2[]=“abcdefghijklmnopqrstuvwxyz”;
char src[]=“内部带有\200的字符串!”;
int n=21;
memccpy(dest2,src,'\200',n);
printf(“%s\n”,dest2);
ft_memccpy(目的地,src,'\200',n);
printf(“%s\n”,dest);
}
这里是第二个测试(test2),我的函数不起作用:
#include "ft_memccpy.c"
#include <stdio.h>
#include <string.h>
int main()
{
char dest[] = "abcdefghijklmnopqrstuvwxyz";
char dest2[] = "abcdefghijklmnopqrstuvwxyz";
char src[] = "string with\200inside !";
int n = 21;
memccpy(dest2, src, 0600, n);
printf("%s\n", dest2);
ft_memccpy(dest, src, 0600, n);
printf("%s\n", dest);
}
#包括“ft_memccpy.c”
#包括
#包括
int main()
{
char dest[]=“abcdefghijklmnopqrstuvwxyz”;
char dest2[]=“abcdefghijklmnopqrstuvwxyz”;
char src[]=“内部带有\200的字符串!”;
int n=21;
memccpy(地址2,src,0600,n);
printf(“%s\n”,dest2);
ft_memccpy(目的地,src,0600,北);
printf(“%s\n”,dest);
}
我算出0600是八进制,十进制应该是384,
但是384不是ascii码,对吗?
关于0600,我得到的唯一信息是“chmod 0600”,它似乎不相关。
sptr
是一个char
数组,因此需要将c
从int
转换为char
,这样等式才有意义:
...
if (*sptr == (char) c)
...
sptr
是一个char
数组,因此您需要将c
从int
转换为char
,这样等式才有意义:
...
if (*sptr == (char) c)
...
将比较转换为使用
无符号字符
void *ft_memccpy(void *dest, const void *src, int c, size_t n) {
unsigned char *dptr = (unsigned char *) dest;
// better style to not cast away const-ness
const unsigned char *sptr = (const unsigned char *) src;
while (n && *dptr && *sptr) {
*dptr = *sptr;
if (*sptr == (unsigned char)c) {
return (++dptr);
}
dptr++;
sptr++;
n--;
}
return 0;
}
即使参数是int
,类似字符串的函数也倾向于只使用字符值。因此,c
as 0600(38410)应仅使用0200(12810)来比较常见的8位无符号字符
void *ft_memccpy(void *dest, const void *src, int c, size_t n) {
unsigned char *dptr = (unsigned char *) dest;
// better style to not cast away const-ness
const unsigned char *sptr = (const unsigned char *) src;
while (n && *dptr && *sptr) {
*dptr = *sptr;
if (*sptr == (unsigned char)c) {
return (++dptr);
}
dptr++;
sptr++;
n--;
}
return 0;
}
执行
unsigned char
而不是char
或signed char
也很重要。在这种情况下,它避免实现定义的行为将int
转换为有符号char
,并使用罕见的non-2补码来避免陷阱,并且不会将+0比较为-0。将比较转换为使用无符号char
void *ft_memccpy(void *dest, const void *src, int c, size_t n) {
unsigned char *dptr = (unsigned char *) dest;
// better style to not cast away const-ness
const unsigned char *sptr = (const unsigned char *) src;
while (n && *dptr && *sptr) {
*dptr = *sptr;
if (*sptr == (unsigned char)c) {
return (++dptr);
}
dptr++;
sptr++;
n--;
}
return 0;
}
即使参数是int
,类似字符串的函数也倾向于只使用字符值。因此,c
as 0600(38410)应仅使用0200(12810)来比较常见的8位无符号字符
void *ft_memccpy(void *dest, const void *src, int c, size_t n) {
unsigned char *dptr = (unsigned char *) dest;
// better style to not cast away const-ness
const unsigned char *sptr = (const unsigned char *) src;
while (n && *dptr && *sptr) {
*dptr = *sptr;
if (*sptr == (unsigned char)c) {
return (++dptr);
}
dptr++;
sptr++;
n--;
}
return 0;
}
执行
unsigned char
而不是char
或signed char
也很重要。在这种情况下,它避免实现定义的行为将int
转换为带符号的char
,并使用罕见的非-2补码来避免陷阱,并且不会将+0与-0进行比较。正确。0600是八进制600。带前导零的数字是。即0600
为6*8²+0*8+0*8⁰
=384
@selbie:memccpy
将其第三个参数转换为无符号字符
。0600是二进制的110-000-000。9位通常不适合于8位字符,因此您只剩下10-000-000。那是0200。这并没有因为你的函数而改变,第9位被编译器砍掉了。无需诊断,理想情况下它会警告您。@selbie:将参数转换为无符号字符
是memccpy
规范的一部分。如果ft_memccpy
不这样做,则它有缺陷。正确。0600是八进制600。带前导零的数字是。即0600
为6*8²+0*8+0*8⁰
=384
@selbie:memccpy
将其第三个参数转换为无符号字符
。0600是二进制的110-000-000。9位通常不适合于8位字符,因此您只剩下10-000-000。那是0200。这并没有因为你的函数而改变,第9位被编译器砍掉了。无需诊断,理想情况下它会警告您。@selbie:将参数转换为无符号字符
是memccpy
规范的一部分。如果ft_memccpy
不这样做,则它有缺陷。