У меня есть строка:
char * someString;
Если я хочу первые пять букв этой строки и хочу установить ее на otherString
, как я сделал бы это?
#include <string.h>
...
char otherString[6]; // note 6, not 5, there's one there for the null terminator
...
strncpy(otherString, someString, 5);
otherString[5] = '\0'; // place the null terminator
Обобщенные:
char* subString (const char* input, int offset, int len, char* dest)
{
int input_len = strlen (input);
if (offset + len > input_len)
{
return NULL;
}
strncpy (dest, input + offset, len);
return dest;
}
char dest[80];
const char* source = "hello world";
if (subString (source, 0, 5, dest))
{
printf ("%s\n", dest);
}
, вам необходимо выделить память для новой строки. В целом за подстроку длины n, что-то вроде этого может работать для вас (не забудьте делать проверку границ ...)
char *subString(char *someString, int n)
{
char *new = malloc(sizeof(char)*n+1);
strncpy(new, someString, n);
new[n] = '\0';
return new;
}
Это вернет подстроку первых N символов SAMESTRION. Убедитесь, что вы освободите память, когда вы закончите, используя бесплатно ().
#include <stdio.h>
#include <string.h>
int main ()
{
char someString[]="abcdedgh";
char otherString[]="00000";
memcpy (otherString, someString, 5);
printf ("someString: %s\notherString: %s\n", someString, otherString);
return 0;
}
Вам не понадобится stdio.h Если вы не используете оператор PrintF и введев константы во всем, но самые маленькие программы плохой вид, и их следует избегать.
strncpy(otherString, someString, 5);
Не забудьте выделить память для других.
Делают все это в двух падающих мазутах:
char *otherString = strncpy((char*)malloc(6), someString);
otherString[5] = 0;
char* someString = "abcdedgh";
char* otherString = 0;
otherString = (char*)malloc(5+1);
memcpy(otherString,someString,5);
otherString[5] = 0;
Обновление :
Совет: Хороший способ понять определения называется правилом правого левого (некоторые ссылки в конце):
Начните чтение от идентификатора и сказать Aloud => SomeString
... »
Сейчас иди направо от самого страны (заявление закончилось с запятой, нечего сказать).
Теперь пойти налево идентификатора ( *
встречается) => Так сказать «... указатель на ...».
Теперь иди налево « *
» (ключевое слово Char
найден) => Скажем "...
Сделанный!
Итак CHAR * SOOTRING;
=> «SOOTRING - это указатель для Char».
Поскольку указатель просто указывает на определенный адрес памяти, он также может быть использован в качестве «отправной точки» для «массива» символов.
Это работает с чем-либо .. Дайте ей:
char* s[2]; //=> s is an array of two pointers to char
char** someThing; //=> someThing is a pointer to a pointer to char.
//Note: We look in the brackets first, and then move outward
char (* s)[2]; //=> s is a pointer to an array of two char
Некоторые ссылки: Как интерпретировать сложные объявления C / C ++ и Как читать объявления C