从const char * src到char * dest的逐字符字符串操作

时间:2016-12-12 07:44:03

标签: c strcat

我试图通过一些操作将char从一个指针逐个复制到另一个指针。我尝试使用strcat(),strncat(),strcpy(),strncpy()但不断收到错误。如何将char指针从源指针复制到目标指针?
我最初通过单引号作为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

4 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

此处最好的方法是直接从src复制到dest

如果您要将源中的xth字节复制到dest中的yth位置,则可以使用。

dest[y] = src[x]

然后你可以将它包装在循环中,以复制任意数量的字节。

请勿忘记在\0的末尾添加dest

答案 3 :(得分:0)

这是我的解决方案

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';
    }