Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串复制到数组实现C_C - Fatal编程技术网

将字符串复制到数组实现C

将字符串复制到数组实现C,c,C,我有一个问题,内容如下: 编写一个函数int-tokenCopychar*dest,const-char*src,int-destSize,将给定源字符串src中的字符复制到给定的目标缓冲区dest中,该缓冲区的大小为destSize,直到: 出现源字符串的结尾,或 目标缓冲区已满,允许使用所需的终止符,或 在输入字符串中找到空格字符 以先到者为准。如果由于找到空间而完成复制,则不会复制该空间。目标字符串必须始终正确终止。如果目标中的源字符串空间不足,则目标字符串必须是源字符串的正确终止的前导子

我有一个问题,内容如下:

编写一个函数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,因此空字符从未被测试过。