2015-08-03 81 views
1

我有一个问题,内容如下:复制字符串数组实现Ç

写函数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没有终止字节?

我做了什么错?在概念上我不了解什么?

谢谢!

+0

的可能重复的[执行块变量是否不一些具体值之一(http://stackoverflow.com/questions/26337003/execute-block-if-a-variable-是不是一个特定值) – Barmar

+0

虽然,建议的d重复看起来像重复,答案真的很混乱,并没有解决一个简单的问题。更糟糕的是,这个例子比较了诸如'“x”'的c字符串和'=='运算符! –

+0

谁在乎?问题在于基本的语言结构,如果不是dup,会因其他原因而关闭。有许多。许多对这种复合条件基础知识的误解。 –

回答

4

*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

是的,基本上是''\ 0'| '''等同于''',而'(32 | 0)'等同于'32'),因此从不测试空字符。 – NiBZ

2

|运算符对两个操作数执行按位“或”运算 - 完全不是你想要的。

C bitwise OR operations

你的测试应该使用逻辑OR运算符,||

if (*src == ' ' || *src == '\0') 
2

这是一个真正的评论,但评论不允许正确的代码格式。我同意@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; 
} 
+0

你是对的;下标更容易阅读 –

0

操作|是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)) { ...