【问题标题】:C character-by-character string manipulation from const char *src to char *dest从 const char *src 到 char *dest 的 C 逐字符字符串操作
【发布时间】:2017-04-27 01:03:07
【问题描述】:

我正在尝试通过一些操作将 char 从一个指针一个一个地复制到另一个指针。我尝试使用 strcat()、strncat()、strcpy()、strncpy(),但不断出现错误。如何将字符从源指针复制到目标指针?
我最初将单引号作为 strcat 的 arg 2 传递,但它不起作用。当我将其更改为双引号时,它起作用了。它与“字符串常量”与“字符常量”或完全不同的东西有关吗?

void korsoroi(char *dest, const char *src) {
    int wcount = 0;
    int i = 0;
    while (src[i] != '\0') {

        if (src[i] == 'k' && src[i + 1] == 's') {
            strcat(dest, "x");
            i++;
        } 
        else if (src[i] == 't' && src[i + 1] == 's') {
            strcat(dest, "z");
            i++;
        } 
        else if (src[i] == ' ') {
            wcount++;
            if (wcount % 3 == 0) {
                strcat(dest, " niinku");
            }
            if (wcount % 4 == 0) {
                strcat(dest, " totanoin");
            }
        } 
        else {
        //expected 'const char *' but argument is of type 'char'
//            strcat(dest, src[i]);
//            strcat(dest, *(src + i);

        //warning: cast to pointer from integer of different size
//            strcat(dest, (char*)src[i]);

        //returns strange characters but compiles
        //dest[strlen(dest)] = src[i];


        }
        i++;
    }
}

http://2016-aalto-c.tmchq.co/en/Module_2/ 任务 08

【问题讨论】:

  • dest 是否可写且有足够的内存?
  • 您可以假设地址 dest 有足够的空间来存储结果字符串。

标签: c strcat


【解决方案1】:

您需要一个跟踪dest 结尾的指针。当您在dest 的末尾添加更多内容时,您会相应地增加另一个指针。示例:

void korsoroi(char *dest, const char *src)
{
  char*  dest_ptr = &dest[strlen(dest)]; // point at end of string

  for(; *src != '\0; src++)
  {
    if(src[i] == whatever)
    {
      strcpy(dest_ptr, "something");
      dest_ptr += sizeof("something");
    }
    else
    {
      *dest_ptr = *src;
      dest_ptr++;
    }
  }

  *dest_ptr = '\0';
}

另外,如果您要使用src[i+1],那么您首先需要检查src[i+1] 不是'\0'

【讨论】:

    【解决方案2】:

    strcat(dest, src[i]); 中,第二个参数是char 而不是char *

    您需要使用 src+i 来代替 char * 。这将复制整个剩余的字符串,不确定您是否想要,否则您需要创建一个只有一个字符的虚拟char *,或者使用另一种方法。

    【讨论】:

    • 你会如何解决这个问题?
    • 构建dest 的更好方法(而不是使用strcat)是使用索引(例如z)并将字符与dest[z++] = src[i] 连接。函数strcat 效率低下,不是为仅附加单个字符而设计的。
    【解决方案3】:

    这里最好的做法是直接从src复制到dest

    如果你想将source中的xth字节复制到dest中的yth位置,那么你可以使用。

    dest[y] = src[x]
    

    然后您可以将其包裹在一个循环中,以复制任意数量的字节。

    不要忘记在dest 末尾添加\0

    【讨论】:

      【解决方案4】:

      这是我的解决方案

      void korsoroi(char *dest, const char *src) {
              int count = 0;
              while (*src) {
                  if (*src == 'k' && *(src + 1) == 's') {
                      *dest++ = 'x';
                      src++;
                  } else if (*src == 't' && *(src + 1) == 's') {
                      *dest++ = 'z';
                      src++;
                  } else if (*src == ' ') {
                      *dest++ = ' ';
                      count++;
                      if (!(count % 3)) {
                          strcpy(dest, "niinku");
                          dest += strlen("niinku");
                          if(*(src + 1)){
                              *dest++ = ' ';
                          }
                      } else if (!(count % 4)) {
                          strcpy(dest, "totanoin");
                          dest += strlen("totanoin");
                          if(*(src + 1)){
                              *dest++ = ' ';
                          }                
                      }
                  } else {
                      *dest++ = *src;
                  }
                  src++;
              }
              *dest = '\0';
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        • 2013-03-25
        • 2013-02-04
        • 1970-01-01
        相关资源
        最近更新 更多