2016-12-12 7 views
1

Я пытаюсь скопировать char один за другим с одного указателя на другой с некоторыми манипуляциями. Я попытался использовать strcat(), strncat(), strcpy(), strncpy(), но продолжать получать ошибки. Как я могу скопировать символ из указателя источника в указатель назначения?
Я изначально передал одиночные кавычки как arg 2 strcat, и это не сработало. Когда я сменил его на двойные кавычки, он сработал. Связано ли это с «строковыми константами» с «символьными константами» или с чем-то совершенно другим?C символьная манипуляция строки из const char * src to char * dest

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

+0

является 'dest' записи и имеет достаточно памяти? –

+0

Вы можете предположить, что достаточно места в адресе dest для хранения полученной строки. –

ответ

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'.

0

В strcat(dest, src[i]);, второй аргумент является char не char *.

Вместо этого необходимо использовать src+i, чтобы иметь char *. Это скопирует всю оставшуюся строку, не обязательно, если вы этого хотите, но в противном случае вам нужно создать манекен char * с одним символом в нем или использовать другой подход.

+0

Как вы подходите к этой проблеме? –

+0

Лучшим способом (вместо использования 'strcat') для создания' dest' является наличие индекса (например, 'z') и конкатенация символов с помощью' dest [z ++] = src [i] '. Функция 'strcat' неэффективна и не предназначена для простого добавления отдельных символов. – Aganju

0

Наилучшим подходом здесь является непосредственно скопировать из src в dest

Если вы хотите скопировать xth байт в источнике, в yth месте в Dest, то вы можете использовать.

dest[y] = src[x] 

Затем вы можете обернуть его вокруг цикла, чтобы скопировать столько байтов, сколько хотите.

Не забудьте добавить \0 в конце dest.

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