добавить символы, чтобы получить строку - PullRequest
1 голос
/ 23 декабря 2009

У меня есть следующий код в C:

    char *str = "Hello World";
    char *s = malloc(strlen(str));
    int i =0;
    for(;i<strlen(str)-5;i++)
    {
        s += *(str+i);
    }
    printf(s);

Это ничего не показывает. Я хочу получить подстроку str, хранящуюся в s.

В Java я бы сделал следующее:

    String str = "Hello World";
    String s="";

    for(int i=0;i<str.length()-5; i++)
        s+=str[i];

    System.out.println(s);

Или вместо этого используйте метод подстроки. Например String s = str.substring(1,2);.

Как мне этого добиться?

Ответы [ 9 ]

6 голосов
/ 23 декабря 2009

Используйте функцию strcpy.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[] ) 
{
  char *str = "Hello World";
  size_t length = strlen(str);

  char *s = (char*)malloc(sizeof(char) * (length + 1));

  strcpy(s, str);

  s[length] = '\0'; // makes sure it's NUL terminated

  printf("%s", s);

  free(s);

  return 0;
}

При выделении целевого буфера обратите внимание на тот факт, что строки заканчиваются символом NUL.

Чтобы скопировать только подстроку, используйте strncpy:

strncpy(s, str + 6, strlen(str) - 6);

просто скопирует "Мир" в s.

В любом случае, убедитесь, что ваши C-строки NUL завершены, прежде чем использовать такие функции, как printf.

См. Также strcat и strncat. И хорошо, ознакомьтесь с массивами и указателями C.

5 голосов
/ 23 декабря 2009

Другие говорили, как правильно решить эту проблему (strcat), но хитрость заключается в том, чтобы думать о типах. С не делает ничего волшебного для вас. s это символ *. что происходит, когда вы добавляете 3 к символу *? Вы получаете еще один символ *, который указывает на 3 символа дальше по линии. Добавление 'a' к символу * - это то же самое, что добавить 97 (ascii of 'a') к указателю и, таким образом, указать на другой символ, расположенный далеко внизу массива ...

Надеюсь, это объясняет, что происходило ...

4 голосов
/ 23 декабря 2009

Вы не можете использовать оператор += для объекта char* - это просто указатель на char. Вместо этого вы захотите использовать strncpy и передать ему предварительно выделенный буфер плюс указатель на то место в строке, с которой вы хотите начать копирование, и количество символов, которое вы хотите копия.

2 голосов
/ 23 декабря 2009

C-строки - это указатели на символы в памяти, а не объекты, как в других языках. Я предлагаю вам Google для объяснения строк (например, этот ), а затем посмотрите на функцию strcpy, определенную в string.h.

0 голосов
/ 16 января 2010

'+' не является оператором конкатенации stribg в C

0 голосов
/ 23 декабря 2009

Использование strncpy():

char *str = "Hello World";         
size_t len = strlen(str) - 5;   
char *s = malloc(len + 1); // +1 for nul terminator
if (s)            
{
  strncpy(s, str, len); // copies strlen(str)-5 characters from str to s
  s[len] = 0; // add nul terminator
}

Несколько более общая функция:

/**
 * Return a substring of _len_ characters starting at position _start_
 * substring("Hello, World", 2, 3) == "llo"
 */
char *substring(char *str, size_t start, size_t len)
{
  char *s = malloc(len + 1);
  if (s)
  {
    strncpy(s, str+start, len);
    s[len] = 0;
  }
  return s;
}

При необходимости добавьте проверки работоспособности (например, start

0 голосов
/ 23 декабря 2009

Вы можете делать то, что просите, со следующими изменениями в вашем коде:

int main (int argc, char *argv[])
{
    char *str = "Hello World";
    char *s = malloc(strlen(str));
    int i = 0;
    for(;i<strlen(str)-5;i++)
    {
        s[i] = *(str+i);
    }
    s[i] = 0;

    printf(s);

   return 0;
}
0 голосов
/ 23 декабря 2009

Вам необходимо выделить память для строки, которая будет содержать подстроку. Может быть, что-то вроде этого:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LESS 4
#define MAX 10 /*Keep it atleast strlen(str) - LESS + 1*/

int main(int argc, char *argv[] )
{

        char *str = "Hello World";
        char s[MAX]; /* Declare the array to hold the substring.*/
        int i =0,j=0; /* i is index into original string and j in the result string. */
        for(;i<strlen(str)-LESS;i++)
        {
                s[j++] = *(str+i);
        }
        s[j] = '\0'; /* Terminate the result string.*/
        printf("%s\n",s); /* Output: Hello W */

        return 0;
}
0 голосов
/ 23 декабря 2009

Для подстрок в целом, где вы хотите опустить символы как в начале, так и в конце, вы должны использовать strncpy или strncat. (Однако будьте осторожны: strncpy не обязательно завершается NUL.)

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