Разыменование указателя строки C в переменную - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть следующая простая программа, которая создает указатель на первый символ строки:

char str[] = "Hello world";                                                   
char *p = &str[0];

Как я могу затем вернуть эту строку в переменную, используя только указатель?

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

Текущий способ, которым я бы подошел к этому, был бы следующим:

  1. Итерация по указателю до достижения нулевого терминатора для поиска длины строки
  2. Создание новогомассив char с этой длиной
  3. Повторяйте, вставляя символы в этот массив снова

Есть ли библиотечная функция для достижения этого, или, если нет, более простой способ, который не включает итерациюдважды?

Ответы [ 4 ]

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

Вот как бы я сделал копию строки, используя только стандартные библиотечные функции:

#include <stdio.h>  // printf
#include <stdlib.h> // malloc
#include <string.h> // strcpy

int main(void)
{
    char str[] = "Hello world"; // your original string
    char *p = (char *)malloc(strlen(str) + 1); // allocate enough space to hold the copy in p
    if (!p) { // malloc returns a NULL pointer when it fails
        puts("malloc failed.");
        exit(-1);
    }
    strcpy(p, str); // now we can safely use strcpy to put a duplicate of str into p
    printf("%s\n", p); // print out this duplicate to verify
    return 0;
}
0 голосов
/ 23 декабря 2018

попробуйте этот код:

#include "stdio.h"
int main(){
char str[] = "Hello world";                                                   
int count = 12; 
char (*p)[12] = &str;
printf("%c\n",(*p)[0]);
printf("%c\n",(*p)[1]);
printf("%c\n",(*p)[2]);
printf("%c\n",(*p)[3]);
printf("%s\n",(*p)); 
}
0 голосов
/ 23 декабря 2018

...

Существует ли библиотечная функция для достижения этого, или, если нет, более простой способ, который не предусматривает повторения дважды?

Как сказанов комментарии strdup () будет делать именно то, что вы хотите.Но здесь есть другая проблема (с вашей точки зрения): strcpy () будет повторять строку дважды, потому что нет другого способа дублировать строку.

По определению, строки в C - это последовательностьсимволы где-то в памяти, последний из которых - NUL (с одиночным L), значение 0 (в символах).Ссылки на строки являются указателями на первый символ в последовательности, изображенной выше.Обратите внимание, что две разные строки могут указывать на одну и ту же память (они не так уж отличаются ...), или строка может указывать на середину другой.Эти два случая несколько особенные, но не редкость.Память для строк должна управляться программистом, который единственный, кто знает, где выделить и освободить место для строк;функции типа strcpy () ничего особенного в этом отношении не делают, они (предположительно) хорошо написаны и оптимизированы, поэтому, возможно, для копирования строки поведение не совсем простое, как я это изобразил ранее, но идея та же.

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

Да, вы должны «сделать это вручную».Поскольку в C нет объектов - вам нужно позаботиться обо всем, что происходит в коде.

Вы можете использовать malloc, strlen и memcpy:

char str[] = "Hello world";                                                   
char *p = malloc(strlen(str) + 1);
if (!p) { abort(); }
memcpy(p, str, strlen(str) + 1);

Вы можете использовать strcpy и забыть об одном strlen:

char *p = malloc(strlen(str) + 1);
if (!p) { abort(); }
strcpy(p, str);

Или вы можете использовать strdup из POSIX или расширение C:

char *p = strdup(str);
if (!p) { abort(); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...