2010-01-07 4 views
0

Как добавить переменную integer в строку и переменную char *? например:
int a = 5;
строка St1 = "Book", St2;
char * Ch1 = "Примечание", Ch2;stick integer to string и char *

St2 = St1 + а -> Book5
Ch2 = Ч1 + а -> Note5

Благодаря

+1

Это домашнее задание? Если да, добавьте тег домашней работы. Как было предложено, вам нужно иметь еще одну строку, а затем вы можете использовать sprintf для создания строки «Book5» с использованием St1 и i. – Jagannath

ответ

2

Путь C++ делать это:

std::stringstream temp; 
temp << St1 << a; 
std::string St2 = temp.str(); 

Вы также можете сделать то же самое с Ch1:

std::stringstream temp; 
temp << Ch1 << a; 
char* Ch2 = new char[temp.str().length() + 1]; 
strcpy(Ch2, temp.str().c_str()); 
+0

'new char [temp.str(). Length() + 1];' не очень C++ ish, вы знаете - это расширение, используемое GCC. – LiraNuna

+0

Появляется несколько ошибок, первая из которых касается первой строки. – aryan

+0

@ LiraNuna Хм, каким образом это расширение GCC? Это просто «новости» - массив символов. (Я использую VC2005/2008, но код отлично работает и в Комо, без расширений) –

0

Вам нужно создать еще одну строку, достаточно большой, чтобы держать исходную строку, а затем номер (т.е. добавьте символ, соответствующий каждой цифре номера, в эту новую строку).

1

для char* вам нужно создать еще одну переменную, которая достаточно долго и , например. Вы можете «исправить» длину выходной строки, чтобы удалить вероятность обхода конца строки. Если вы это сделаете, будьте осторожны, чтобы сделать это достаточно большим, чтобы удерживать все число, иначе вы можете обнаружить, что книга + 50 и книга + 502 выходят как книга + 50 (усечение).

Ниже описано, как вручную рассчитать объем требуемой памяти. Это наиболее эффективно, но подвержено ошибкам.

int a = 5; 
char* ch1 = "Book"; 
int intVarSize = 11; // assumes 32-bit integer, in decimal, with possible leading - 
int newStringLen = strlen(ch1) + intVarSize + 1; // 1 for the null terminator 
char* ch2 = malloc(newStringLen); 
if (ch2 == 0) { exit 1; } 
snprintf(ch2, intVarSize, "%s%i", ch1, a); 

ch2 теперь содержит комбинированный текст.

В качестве альтернативы, и немного менее сложным, а также похорошела (но менее эффективно) вы также можете сделать «пробный запуск» в Printf, чтобы получить требуемую длину:

int a = 5; 
char* ch1 = "Book"; 
// do a trial run of snprintf with max length set to zero - this returns the number of bytes printed, but does not include the one byte null terminator (so add 1) 
int newStringLen = 1 + snprintf(0, 0, "%s%i", ch1, a); 
char* ch2 = malloc(newStringLen); 
if (ch2 == 0) { exit 1; } 
// do the actual printf with real parameters. 
snprintf(ch2, newStringLen, "%s%i", ch1, a); 

если ваша платформа включает в себя asprintf, то это намного проще, поскольку asprintf автоматически выделяет правильный объем памяти для вашей новой строки.

int a = 5; 
char* ch1 = "Book"; 
char* ch2; 
asprintf(ch2, "%s%i", ch1, a); 

ch2 теперь содержит комбинированный текст.

C++ гораздо менее затруднительно, но я оставлю это другим, чтобы описать.

+0

Ошибка C3861: 'snprintf': идентификатор не найден. – aryan

+0

#include должен исправить это, но если это не так, в вашей среде сборки что-то не так, или, возможно, ваша платформа не включает snprintf.Это маловероятно, поскольку это один из самых важных инструментов безопасности кода. –

-1
Try this out: 
char *tmp = new char [ stelen(original) ]; 
itoa(integer,intString,10); 

output = strcat(tmp,intString); 

//use output string 

delete [] tmp; 
+0

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