свяжите массив символов в C

У меня есть массив символов:

char* name = "hello";

Я хочу добавить расширение того имени для создания его

hello.txt

Как я могу сделать это?

name += ".txt" не будет работать

37
задан Tyler Carter 7 February 2010 в 21:48
поделиться

5 ответов

Have a look at the strcat function.

In particular, you could try this:

const char* name = "hello";
const char* extension = ".txt";

char* name_with_extension;
name_with_extension = malloc(strlen(name)+1+4); /* make space for the new string (should check the return value ...) */
strcpy(name_with_extension, name); /* copy name into the new var */
strcat(name_with_extension, extension); /* add the extension */
58
ответ дан 27 November 2019 в 04:15
поделиться

Сначала скопируйте текущую строку в больший массив с помощью strcpy , затем используйте strcat ].

Например, вы можете сделать:

char* str = "Hello";
char dest[12];

strcpy( dest, str );
strcat( dest, ".txt" );
11
ответ дан 27 November 2019 в 04:15
поделиться

Вопреки тому, что многие считают, наличие хорошего кластеризованного индекса в таблице может на самом деле сделать операции, такие как INSERT, быстрее - да, быстрее!

Ознакомьтесь с исходным блогом Обсуждение кластеризованного индекса продолжается.... Кимберли Трипп - последняя индексирующая королева.

Она упоминает (примерно в середине статьи):

Вставки быстрее в кластеризованном таблица (но только в «правом» кластеризованная таблица), чем по сравнению с куча. Главная проблема здесь в том, что поиск в IAM/PFS для определения расположение вставки в куче: медленнее, чем в кластеризованной таблице (где место вставки известно, определяется кластеризованным ключом). Вставки быстрее при вставке в таблицу где порядок определен (CL) и где этот порядок постоянно увеличивается.

Решающим пунктом является то, что только при правильном кластеризованном индексе вы сможете воспользоваться преимуществами - когда кластеризованный индекс уникален, узок, стабилен и оптимально постоянно увеличивается. Лучше всего использовать столбец INT IDENTITY.

У Кимберли Трипп также есть отличная статья о том, как выбрать наилучший возможный ключ кластеризации для ваших таблиц, и какие критерии он должен выполнить - см. ее пост, озаглавленный Постоянно увеличивающийся ключ кластеризации - кластерные дебаты по индексу.......... снова!

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

-121--2416419-

Я думаю, что ответы от Вич и Бейли верны и достаточны, но чтобы помочь уточнить тем, кто прокомментировал: Когда вы объявляете typedef результирующий тип должен быть согласованным везде, где он может быть использован. Что если созданный typedef появится в следующем коде:

INT2 myfunction()
{
  return 0;
}

class MyClass
{
  public: INT2 x;
};

INT2 MyClass::x;
  • Функция, возвращающая INT2, не будет иметь смысла. Конечно, возвращаемое значение не является статическим (оно не может быть).
  • Объявление члена x в MyClass будет статическим, а также его более позднее определение? Это не только избыточно, неверно, потому что вы не используете ключевое слово static при определении статического члена - только при объявлении его.

То же самое относится и к другим ключевым словам, упомянутым Бейли. Вдумайтесь: единственными ключевыми словами, которые могут последовательно объявлять тип для всех его применений, являются сами примитивные типы, и модификаторы типа (const, unsigned и т. д.).

-121--2118641-

У меня есть массив символов:

 char * name = «hello»;

Нет, имеется символьный указатель на строковый литерал . Во многих случаях можно добавить модификатор const, в зависимости от того, интересует ли вас, с каким именем точек или значением последовательности, « hello ». Не следует пытаться изменить литерал («hello»), так как могут произойти плохие вещи .

Главное, чтобы передать, что C не имеет надлежащего (или первоклассный ) тип последовательности. «Последовательности» обычно представляют собой массивы символов (символов) с завершающим значением null («\0 »или десятичный 0)символ для обозначения конца последовательности или указатели на массивы символов.

Я бы предложил прочитать Символьные массивы , раздел 1.9 в языке программирования Си (стр. 28, второе издание). Я настоятельно рекомендую прочитать эту небольшую книгу (< 300 страниц), чтобы узнать С.

В дополнение к вашему вопросу, разделы 6 - Массивы и указатели и раздел 8 - Символы и последовательности из C FAQ могут помочь. Вопрос 6,5 и 8,4 могут быть хорошими местами для начала.

Надеюсь, это поможет вам понять, почему ваш отрывок не работает. Другие обрисовали, какие изменения необходимы для того, чтобы он заработал. В основном вам нужно множество случайной работы (множество знаков) достаточно большой, чтобы снабдить всю последовательность завершением (заканчивающим) '\0' характеров. Затем вы можете использовать стандартную функцию библиотеки C strcpy (или лучше еще strncpy), чтобы скопировать в нее «Hello», а затем вы хотите объединить с помощью стандартной функции библиотеки C strcat (или лучше еще strncat). Необходимо включить файл заголовка string.h для объявления объявлений функций.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
    char filename[128];
    char* name = "hello";
    char* extension = ".txt";

    if (sizeof(filename) < strlen(name) + 1 ) { /* +1 is for null character */
        fprintf(stderr, "Name '%s' is too long\n", name);
        return EXIT_FAILURE;
    }
    strncpy(filename, name, sizeof(filename));

    if (sizeof(filename) < (strlen(filename) + strlen(extension) + 1) ) {
        fprintf(stderr, "Final size of filename is too long!\n");
        return EXIT_FAILURE;
    }
    strncat(filename, extension, (sizeof(filename) - strlen(filename)) );
    printf("Filename is %s\n", filename);

    return EXIT_SUCCESS;
}
19
ответ дан 27 November 2019 в 04:15
поделиться

Вы можете скопировать и вставить здесь ответ или прочитать, что наш ведущий Джоэл говорит о strcat .

5
ответ дан 27 November 2019 в 04:15
поделиться
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *name = "hello";

int main(void) {
  char *ext = ".txt";
  int len   = strlen(name) + strlen(ext) + 1;
  char *n2  = malloc(len);
  char *n2a = malloc(len);

  if (n2 == NULL || n2a == NULL)
    abort();

  strlcpy(n2, name, len);
  strlcat(n2, ext, len);
  printf("%s\n", n2);

  /* or for conforming C99 ...  */
  strncpy(n2a, name, len);
  strncat(n2a, ext, len - strlen(n2a));
  printf("%s\n", n2a);

  return 0; // this exits, otherwise free n2 && n2a
}
1
ответ дан 27 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: