У меня есть строка:
char * someString;
Если мне нужны первые пять букв этой строки и вы хотите установить ее на otherString
, как бы я это сделал?
У меня есть строка:
char * someString;
Если мне нужны первые пять букв этой строки и вы хотите установить ее на otherString
, как бы я это сделал?
#include <string.h>
...
char otherString[6]; // note 6, not 5, there one there for the null terminator
...
strncpy(otherString, someString, 5);
otherString[5] = '\0'; // place the null terminator
char* someString = "abcdedgh";
char* otherString = 0;
otherString = (char*)malloc(5+1);
memcpy(otherString,someString,5);
otherString[5] = 0;
UPDATE:
Подсказка: Хороший способ понять определения называется правым левым правилом (некоторые ссылки в конце):
Начните читать с идентификатора и скажите вслух = > "someString
is..."
Теперь перейдите к правой части someString (утверждение закончилось точкой с запятой, нечего сказать).
Теперь идите слева от идентификатора (встречается *
) = > так скажите "... указатель на...".
Теперь перейдите влево от "*
" (найдено ключевое слово char
) = > say "..char".
Готово!
So char* someString;
= > "someString является указателем на 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
Обобщенные:
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);
}
Вам потребуется выделить память для новой строки otherString. В общем случае для подстроки длины n для вас может работать что-то вроде этого (не забудьте сделать проверку границ...)
char *subString(char *someString, int n)
{
char *new = malloc(sizeof(char)*n+1);
strncpy(new, someString, n);
new[n] = '\0';
return new;
}
Это вернет подстроку первых n символов someString. Убедитесь, что вы освободили память, когда закончите с ней, используя free().
Вы можете использовать snprintf для получения подстроки массива char с точностью. Вот пример файла под названием substring.c:
#include <stdio.h>
int main()
{
const char source[] = "This is a string array";
char dest[17];
// get first 16 characters using precision
snprintf(dest, sizeof(dest), "%.16s", source);
// print substring
puts(dest);
} // end main
Вывод:
Это строка
Примечание:
Для получения дополнительной информации см. страницу руководства printf.
strncpy(otherString, someString, 5);
Не забудьте выделить память для другойString.
#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 и ставьте константы во всех, кроме самых маленьких программ, в плохую форму, и ее следует избегать.
Выполняя все это двумя выпадами:
char *otherString = strncpy((char*)malloc(6), someString);
otherString[5] = 0;
char largeSrt[] = "123456789-123"; // original string
char * substr;
substr = strchr(largeSrt, '-'); // we save the new string "-123"
int substringLength = strlen(largeSrt) - strlen(substr); // 13-4=9 (bigger string size) - (new string size)
char *newStr = malloc(sizeof(char) * substringLength + 1);// keep memory free to new string
strcpy(newStr, largeSrt, substringLength); // copy only 9 characters
newStr[substringLength] = '\0'; // close the new string with final character
printf("newStr=%s\n", newStr);
free(newStr); // you free the memory
Я думаю, что это простой способ... но я не знаю, как я могу передать переменную результата непосредственно, тогда я создаю локальный массив char как temp и верну его.
char* substr(char *buff, uint8_t start,uint8_t len, char* substr)
{
strncpy(substr, buff+start, len);
substr[len] = 0;
return substr;
}
Этот код является функцией substr, которая имитирует функцию с таким же именем, присутствующую в других языках, просто разберите: string, start и количество символов, например:
printf( "SUBSTR: %s", substr("HELLO WORLD!",2,5) );
Выше будет напечатано Привет. Если вы передадите значение по всей длине строки, оно будет игнорироваться, так как цикл только повторяет длину строки.
char *substr(char *s, int a, int b) {
char *r = (char*)malloc(b);
strcpy(r, "");
int m=0, n=0;
while(s[n]!='\0')
{
if ( n>=a && m<b ){
r[m] = s[n];
m++;
}
n++;
}
r[m]='\0';
return r;
}