【问题标题】:Copying characters from a source string to a buffer - C将字符从源字符串复制到缓冲区 - C
【发布时间】:2015-10-29 12:02:50
【问题描述】:

我目前正在从事一个计算机科学项目,并且在一个我似乎无法解决的非常具体的案例中完全正常工作。代码的目标是编写一个函数 int tokenCopy(char* dest, const char* src, int destSize),它将字符从给定的源字符串 src 复制到给定的目标缓冲区 dest,其大小为 destSize,直到:

出现源字符串的结尾,或者 目标缓冲区已满(允许需要的终止符),或在输入字符串中找到空格字符

以先到者为准。如果由于找到空间而完成复制,则不复制该空间。目标字符串必须始终正确终止。如果源字符串的目标空间不足,则目标字符串必须是源字符串的正确终止的前导子字符串。

返回值是复制的字符数,不包括终止的空字节。

测试的形式是:

char buff[3];
int n = tokenCopy(buff, "This is a string", 3);
printf("%d '%s'\n", n, buff);

这是我目前的代码:

#include <stdio.h>
 int tokenCopy(char* dest, const char* src, int destSize){
        int new_value = 0;
        int i=0;


        for (;*src != ' '; new_value++){
        destSize = 1;
        return new_value;
        }

        for (; *src != '\0' && *src!= ' '; new_value++)
        {
            while (i < destSize-1 && *src!= '\0'){
            *dest = *src;
            dest++;
            src++;
            new_value++;
            i++;

        *dest = '\0';
            }
        return new_value;
       }
    return new_value;
   }

但是在以下测试的情况下:

char buff[10];
int n = tokenCopy(buff, " ", 10);
printf("%d '%s'\n", n, buff);

输出应该是:

0 ''

但是,我的代码输出零,然后是包含不同字母的语音标记,然后是我尝试对代码进行的每次更改时带菱形的问号。作为参考,我正在使用带有 Geany IDE 的 linux。

对于这个问题的任何帮助将不胜感激。

【问题讨论】:

  • 第一个 for 循环怎么样?

标签: c loops pointers


【解决方案1】:

你需要在函数内部赋值给dest

int tokenCopy(char *dest, const char *src, int destSize) {
    *dest = 0;
    // rest of the code
}

【讨论】:

    【解决方案2】:

    去掉第一个for循环后,你可以将第二个for循环修改成类似

    for ( i = 0; *src != '\0' && *src!= ' ' && (i < destSize-1) ; i++)
    {
       *dest++ = *src++;
    }
    *dest = '\0';
    
    return new_value;
    

    得到你想要的。修改包括

    • 摆脱对空字符串的冗余检查。
    • 结合值的复制和指针增量
    • 添加目标长度检查作为循环本身的终止条件

    【讨论】:

      【解决方案3】:

      即使是函数实现的第一个循环

          for (;*src != ' '; new_value++){
          destSize = 1;
          return new_value;
          }
      

      没有意义。

      函数可以这样写

      #include <stdio.h>
      
      size_t tokenCopy( char *dest, const char *src, size_t destSize )
      {
          size_t n = 0;
      
          if ( destSize != 0 )
          {        
              while ( n < destSize && *src && *src != ' ' ) dest[n++] = *src++;
      
              dest[n == destSize ? --n : n] = '\0';
          }        
      
          return n;
      }
      
      int main( void )
      {
          char buff[10];
          size_t n;
      
          n = tokenCopy( buff, " ", 10 );
          printf("%zu \"%s\"\n", n, buff );    
      
          n = tokenCopy( buff, "0123456789", 10 );
          printf("%zu \"%s\"\n", n, buff );    
      }    
      

      程序输出是

      0 ""
      9 "012345678"
      

      【讨论】:

        【解决方案4】:
        #include<stdio.h>
        
        int tokenCopy(char* dest, const char* src, int destSize){
                while(*src && destSize>1 && *src!=' ') {
        
                        *dest = *src;
        
                        dest++;
                        src++;
                        destSize--;
                }
        
                *dest = '\0';
        
        
        }
        
        main(int argc, char **argv)
        {
                char buff[6];
                tokenCopy(buff,"Th",6);
        
                printf("%s\n",buff);
        }
        

        【讨论】:

          猜你喜欢
          • 2012-07-17
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-14
          • 1970-01-01
          相关资源
          最近更新 更多