У меня есть массив символов:
char* name = "hello";
Я хочу добавить расширение того имени для создания его
hello.txt
Как я могу сделать это?
name += ".txt"
не будет работать
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 */
Сначала скопируйте текущую строку в больший массив с помощью strcpy , затем используйте strcat ].
Например, вы можете сделать:
char* str = "Hello";
char dest[12];
strcpy( dest, str );
strcat( dest, ".txt" );
Вопреки тому, что многие считают, наличие хорошего кластеризованного индекса в таблице может на самом деле сделать операции, такие как INSERT, быстрее - да, быстрее!
Ознакомьтесь с исходным блогом Обсуждение кластеризованного индекса продолжается.... Кимберли Трипп - последняя индексирующая королева.
Она упоминает (примерно в середине статьи):
Вставки быстрее в кластеризованном таблица (но только в «правом» кластеризованная таблица), чем по сравнению с куча. Главная проблема здесь в том, что поиск в IAM/PFS для определения расположение вставки в куче: медленнее, чем в кластеризованной таблице (где место вставки известно, определяется кластеризованным ключом). Вставки быстрее при вставке в таблицу где порядок определен (CL) и где этот порядок постоянно увеличивается.
Решающим пунктом является то, что только при правильном кластеризованном индексе вы сможете воспользоваться преимуществами - когда кластеризованный индекс уникален, узок, стабилен и оптимально постоянно увеличивается. Лучше всего использовать столбец INT IDENTITY.
У Кимберли Трипп также есть отличная статья о том, как выбрать наилучший возможный ключ кластеризации для ваших таблиц, и какие критерии он должен выполнить - см. ее пост, озаглавленный Постоянно увеличивающийся ключ кластеризации - кластерные дебаты по индексу.......... снова!
Если у вас есть такой столбец - например, суррогатный первичный ключ - используйте его для вашего ключа кластеризации, и вы должны видеть очень хорошую производительность на вашем столе - даже на множестве INSERT.
-121--2416419-Я думаю, что ответы от Вич и Бейли верны и достаточны, но чтобы помочь уточнить тем, кто прокомментировал: Когда вы объявляете typedef результирующий тип должен быть согласованным везде, где он может быть использован. Что если созданный typedef появится в следующем коде:
INT2 myfunction()
{
return 0;
}
class MyClass
{
public: INT2 x;
};
INT2 MyClass::x;
То же самое относится и к другим ключевым словам, упомянутым Бейли. Вдумайтесь: единственными ключевыми словами, которые могут последовательно объявлять тип для всех его применений, являются сами примитивные типы, и модификаторы типа (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;
}
Вы можете скопировать и вставить здесь ответ или прочитать, что наш ведущий Джоэл говорит о strcat .
#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
}