Строки в C, как получить subString - PullRequest
46 голосов
/ 22 января 2010

У меня есть строка:

char * someString;

Если я хочу получить первые пять букв этой строки и установить для нее значение otherString, как мне это сделать?

Ответы [ 11 ]

51 голосов
/ 22 января 2010
#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
7 голосов
/ 22 января 2010

Обобщенный:

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);
}
7 голосов
/ 22 января 2010
char* someString = "abcdedgh";
char* otherString = 0;

otherString = (char*)malloc(5+1);
memcpy(otherString,someString,5);
otherString[5] = 0;

UPDATE
Подсказка: Хороший способ понять определения называется правилом справа налево (некоторые ссылки в конце):

Начните чтение с идентификатора и произнесите вслух => "someString is ..."
Теперь перейдите направо от someString (оператор заканчивается точкой с запятой, нечего сказать).
Теперь идите налево от идентификатора (* встречается) => так сказать "... указатель на ...".
Теперь идите налево от "*" (ключевое слово char найдено) => произнесите "..char".
Готово!

Итак char* someString; => "someString - указатель на символ".

Поскольку указатель просто указывает на определенный адрес памяти, его также можно использовать в качестве «начальной точки» для «массива» символов.

Это работает с чем угодно ... попробуй:

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

5 голосов
/ 22 января 2010

Вам необходимо выделить память для новой строки 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 ().

4 голосов
/ 08 октября 2017

Вы можете использовать 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.

0 голосов
/ 03 февраля 2019

Этот код является substr функцией, которая имитирует функцию с тем же именем, присутствующую в других языках, просто анализ: строка, начало и количество символов, например:

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;
}
0 голосов
/ 27 февраля 2017

Я думаю, что это простой способ ... но я не знаю, как я могу передать переменную результата напрямую, тогда я создаю локальный массив символов как temp и возвращаю его.

char* substr(char *buff, uint8_t start,uint8_t len, char* substr)
{
    strncpy(substr, buff+start, len);
    substr[len] = 0;
    return substr;
}
0 голосов
/ 21 февраля 2017
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 
0 голосов
/ 22 января 2010

Делаем все за два удара:

char *otherString = strncpy((char*)malloc(6), someString);
otherString[5] = 0;
0 голосов
/ 22 января 2010
#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 и не ставите константы во всех программах, кроме самых маленьких, это дурной тон, и его следует избегать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...