复制字符串数组实现Ç
我有一个问题,内容如下:复制字符串数组实现Ç
写函数int tokenCopy(字符* DEST,常量字符* SRC,INT destSize)从给定的源串拷贝的字符SRC到给定的目标缓冲区DEST,这是大小destSize的,直到:
串发生源的端部,或
目标缓冲区已满(允许将要需要的终止子),或
a sp ace字符在输入字符串中找到
以先到者为准。如果因为找到空格而完成复制,则不会复制该空间。目标字符串必须始终正确终止。如果源字符串的目标地址空间不足,则目标字符串必须是源字符串正确终止的前导子字符串。
返回值是复制的字符数,不包括终止空字节。
这是我尝试迄今:
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);
,因为它返回,而不是4 为什么不终止后7号它处理了前四个字母?我不明白为什么src没有终止字节?
我做了什么错?在概念上我不了解什么?
谢谢!
*src != ('\0' | ' ')
不会做你认为的事情。
你需要把它分成两个:与
*src != '\0' && *src!= ' '
相同:
if (*src == (32 | 0))
它应该是:
if (*src == ' ' || *src)
它总是最好使用字符表示' '
比假设/依赖于ASCII值。
事实上,在循环内的整个条件是reduntant:
if (*src == (32 | 0))
{
*dest = '\0';
return the_slab;
}
这就是你在for
循环条件测试什么了。
是的,基本上是''\ 0'| '''等同于''',而'(32 | 0)'等同于'32'),因此从不测试空字符。 – NiBZ
|
运算符对两个操作数执行按位“或”运算 - 完全不是你想要的。
你的测试应该使用逻辑OR运算符,||
:
if (*src == ' ' || *src == '\0')
这是一个真正的评论,但评论不允许正确的代码格式。我同意@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(OR)运算符。 (*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)) { ...
的可能重复的[执行块变量是否不一些具体值之一(http://*.com/questions/26337003/execute-block-if-a-variable-是不是一个特定值) – Barmar
虽然,建议的d重复看起来像重复,答案真的很混乱,并没有解决一个简单的问题。更糟糕的是,这个例子比较了诸如'“x”'的c字符串和'=='运算符! –
谁在乎?问题在于基本的语言结构,如果不是dup,会因其他原因而关闭。有许多。许多对这种复合条件基础知识的误解。 –