Как объединить две строки, где исходная строка должна быть добавлена ​​перед целевой строкой? - PullRequest
0 голосов
/ 27 августа 2010

Я застрял в еще одной проблеме C. Как я могу объединить две строки со второй строкой, вставляемой перед первой строкой?

Это то, что я придумал. К сожалению, я застрял во всех этих указателях на символы, массивы символов и так далее.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[] )
{
  char* output;
  int i;
  for(i = 9; i > 0; i--)
  {
    unsigned int value = (unsigned int)i;
    char buffer[20];
    sprintf(buffer, "%u", value);
//    strcat(ouput, buffer);  // append before the string.
    // first loop: 9
    // second loop: 89
    // third loop: 789
  }

  printf("%s", output);
}

Как мне исправить свой код, чтобы он работал? Я думаю, что я должен как-то установить выходную переменную на пустой. Когда мне нужна фиксированная ширина для массива char или указателя? 20 было случайным предположением от меня.

Ответы [ 5 ]

3 голосов
/ 27 августа 2010

Я очень смущен, так как ваш опубликованный код не имеет абсолютно никакого отношения к проблеме, о которой вы говорите.(Хорошо, они оба используют строки, но это все)

  char* src  = "Hello, ";
  char* dest = "World!";

  char* temp;
  temp = malloc(strlen(src) +strlen(dest) + 1);
  strcpy(temp, src);
  strcat(temp, dest);

  dest = temp;

Если dest не является фиксированным буфером соответствующего размера для объединенной строки.Если это так, то замените последнюю строку на:

  strcpy(dest, temp);
  free(temp);

Теперь, если вы хотите специально построить список цифр назад, давайте попробуем другой такт:

  char buffer[10];
  buffer[9] = '\0';  // null terminate our string.
  char* output;    
  int i;    
  for(i = 9; i > 0; i--)    
  {    
       // this is a fast way of saying, sprintf("%u", i); 
       // works only for single digits
       char d = (char)('0' + i); 

       buffer[i-1] = d;
       output = &buffer[i-1];
       printf("%s", output);
   }
2 голосов
/ 27 августа 2010

Обычно вам следует просто избегать ситуации, с которой нужно начинать. Наиболее очевидным решением для вашего примера было бы просто считать вверх, чтобы начать с. Когда это не подходит, рекурсивное решение для обратного порядка, в котором строится строка, может все еще позволить вам генерировать строку от начала до конца:

int build_string(int value, char *string) { 
    char temp[10];

    if (value > -1)
        build_string(value-1, string);

    sprintf(temp, "%d", value); // use snprintf if available.
    strcat(string, temp);
    return string;
}

int main() { 
    char result[20] = {0};
    build_string(9, result);
    printf("%s", result);
    return 0;
}
1 голос
/ 27 августа 2010

Предполагая, что буфер назначения достаточно велик и что источник и назначение не перекрываются:

// not sure what order to put the params - the usual C way is destination
// followed by source, but it's also potentially confusing that the result of 
// prepend(foo,bar) is "<bar><foo>".
char* prepend(char *restrict dest, const char *restrict src) {
    size_t len = strlen(src);
    memmove(dest + len, dest, strlen(dest));
    return memcpy(dest, src, len);
}

Если буферы могут перекрываться (например, если src - вторая половина dest), этот подход не работает.

Если целевой буфер недостаточно велик, тогда кто-то должен выделить новую память для результата, и в этом случае вопрос о том, какой является «источником», а какой«пункт назначения» исчезает - оба они являются «источником», и ни один из них не является «пунктом назначения».

1 голос
/ 27 августа 2010

Для вашей заявленной проблемы (вставьте одну строку перед другой), этот код выполнит работу - но не имеет проверки ошибок.Предполагается, что в целевом буфере достаточно места для существующей строки и нового префикса:

/* Insert string t in front of string s in string s */
char *strinsert(char *s, const char *t)
{
    char           *p = s + strlen(s);
    char           *q = p + strlen(t);
    char           *r = s;

    while (p >= s)
        *q-- = *p--;
    while (*t)
        *s++ = *t++;
    return(r);
}

То, что он делает, это копирует существующую строку на правильное количество мест, чтобы было место дляновая строка в начале.

1 голос
/ 27 августа 2010

Вы можете добавить целое число в конце строки как:

int i;
char buffer[20];
for(i = 0; i < 10; i++) {
        sprintf(buffer+i, "%u", i);
}
printf("%s", buffer); // prints 0123456789
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...