C - объединить все головы строки - PullRequest
3 голосов
/ 05 октября 2009

ОК, недавняя запись викторины поручила студенту написать метод longhead (char * longhead), который бы возвращал строку, состоящую из конкатенации всех голов в данной строке. Пример:

char *string = "this";
printf("%s\n", longhead(string));

ВЫХОД: tththithis

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

Есть ли решение для этого? В качестве альтернативы ... это можно сделать просто используя 'strlen'?

UPDATE:

Вот решение, которое я написал, которое работает только с массивом char и находится внутри основного метода:

char *toPrint = "roses";
int i, j = strlen(toPrint); 
char toPrintArray[j];
for(i = 0; *toPrint != 0; toPrint++, i++){
    toPrintArray[i] = *toPrint;
}
int k;
for(i = 0; i < j; i++){
    for(k = 0; k < i; k++)
        printf("%c", toPrintArray[k]);
}

1 Ответ

5 голосов
/ 05 октября 2009

Длина желаемой строки (когда длина ввода равна N) равна (N * (N+1)) / 2 (сумма целых чисел от 1 до N, иногда называемая «формулой Гаусса»). Так что ...:

char* longhead(const char* s)
{
    int len = strlen(s);
    char * result = malloc(1 + (len * (len+1))/2);
    char * p = result;
    int i;

    for(i=1; i<=len; ++i) {
      memcpy(p, s, i);
      p += i;
    }
    *p = 0;

    return result;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...