将字符串复制到数组实现C
我有一个问题,内容如下: 编写一个函数int-tokenCopychar*dest,const-char*src,int-destSize,将给定源字符串src中的字符复制到给定的目标缓冲区dest中,该缓冲区的大小为destSize,直到: 出现源字符串的结尾,或 目标缓冲区已满,允许使用所需的终止符,或 在输入字符串中找到空格字符 以先到者为准。如果由于找到空间而完成复制,则不会复制该空间。目标字符串必须始终正确终止。如果目标中的源字符串空间不足,则目标字符串必须是源字符串的正确终止的前导子字符串 返回值是复制的字符数,不包括终止的空字节 这是我迄今为止的尝试:将字符串复制到数组实现C,c,C,我有一个问题,内容如下: 编写一个函数int-tokenCopychar*dest,const-char*src,int-destSize,将给定源字符串src中的字符复制到给定的目标缓冲区dest中,该缓冲区的大小为destSize,直到: 出现源字符串的结尾,或 目标缓冲区已满,允许使用所需的终止符,或 在输入字符串中找到空格字符 以先到者为准。如果由于找到空间而完成复制,则不会复制该空间。目标字符串必须始终正确终止。如果目标中的源字符串空间不足,则目标字符串必须是源字符串的正确终止的前导子
int tokenCopy(char* dest, const char* src, int destSize)
{
int the_slab = 0;
for (; *src != ('\0' | ' '); the_slab++)
{
if ( *src == (32 | 0))
{
*dest = '\0';
return the_slab;
}
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return the_slab;
}
但是,当通过以下测试时,它失败:
char buff[10];
int n = tokenCopy(buff, "This", 10);
printf("%d '%s'\n", n, buff);
因为它返回的是数字7,而不是4。
为什么它在处理完前四个字母后不终止?我不明白为什么src没有终止字节
我做错了什么?我在概念上不理解什么
谢谢 *src!='\0“|”不会做您认为它会做的事情
您需要将其分为两部分:
*src != '\0' && *src!= ' '
同样适用于:
if ( *src == (32 | 0))
应该是:
if ( *src == ' ' || *src )
使用字符表示法“”总比假定/依赖ASCII值好
事实上,循环中的整个条件是冗余的:
if ( *src == (32 | 0))
{
*dest = '\0';
return the_slab;
}
这就是您在for循环条件下测试的内容。*src!='\0“|”不会做您认为它会做的事情
您需要将其分为两部分:
*src != '\0' && *src!= ' '
同样适用于:
if ( *src == (32 | 0))
应该是:
if ( *src == ' ' || *src )
使用字符表示法“”总比假定/依赖ASCII值好
事实上,循环中的整个条件是冗余的:
if ( *src == (32 | 0))
{
*dest = '\0';
return the_slab;
}
这是您在for循环条件中已经测试过的。运算符对两个操作数执行按位OR运算-完全不是您想要的
测试应使用逻辑OR运算符| |:
|运算符对两个操作数执行按位或运算-完全不是您想要的
测试应使用逻辑OR运算符| |:
这实际上是一个注释,但注释不允许正确的代码格式。我同意JohnPirie和BlueMoon的答案 这是一个使用数组索引比使用指针更干净的示例,如下代码所示:
int tokenCopy(char* dest, const char* src, int destSize)
{
int i;
if (dest == NULL || source == NULL || destSize < 1) {
// invalid input!
return -1;
}
for (i = 0; i < (destSize-1) && src[i] != '\0' && src[i] != ' '; i++) {
dest[i] = src[i];
}
dest[i] = '\0';
return i;
}
这实际上是一个注释,但注释不允许正确的代码格式。我同意JohnPirie和BlueMoon的答案 这是一个使用数组索引比使用指针更干净的示例,如下代码所示:
int tokenCopy(char* dest, const char* src, int destSize)
{
int i;
if (dest == NULL || source == NULL || destSize < 1) {
// invalid input!
return -1;
}
for (i = 0; i < (destSize-1) && src[i] != '\0' && src[i] != ' '; i++) {
dest[i] = src[i];
}
dest[i] = '\0';
return i;
}
运算符|为bitwize或运算符。if*src==32 | 0的指令与if*src==32的指令相同。因为32 | 0==32;
还记得逻辑表吗
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1= 1
bitwize运算符将源中的每一位和dest中的每一位进行比较,因为0关闭了所有位,所以32中的每一位都保持不变
您必须这样做,以使其工作:
if ( (*src == 32) || (*src== 0)) { ...
运算符|为bitwize或运算符。if*src==32 | 0的指令与if*src==32的指令相同。因为32 | 0==32;
还记得逻辑表吗
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1= 1
bitwize运算符将源中的每一位和dest中的每一位进行比较,因为0关闭了所有位,所以32中的每一位都保持不变
您必须这样做,以使其工作:
if ( (*src == 32) || (*src== 0)) { ...
可能的重复虽然,提议的重复看起来像是重复的,但那里的答案真的很混乱,不能解决一个简单的问题。更糟糕的是,该示例将x等c字符串与==运算符进行比较!谁在乎呢?问题在于基本的语言结构,如果不是dup,可能会因为其他原因关闭。有很多。许多人对复合条件句的基本原理有这样的误解。可能的重复虽然,提议的重复看起来像是重复的,但那里的答案真的很混乱,不能解决一个简单的问题。更糟糕的是,该示例将x等c字符串与==运算符进行比较!谁在乎呢?问题在于基本的语言结构,如果不是dup,可能会因为其他原因关闭。有很多。很多人都对复合条件句的基本原理有这样的误解。是的,基本上“\0”|“相当于“”,32 | 0相当于32,因此空字符从未被测试过。是的,基本上“\0”|“相当于“”,32 | 0相当于32,因此空字符从未被测试过。