Как назначить массив символов для строкового литерала - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть массив char, и я пытаюсь получить строковый литерал с такими же символами в массиве.

Я попробовал strcpy и try =, и я попробовал то, что сделал в следующемкод.Но, похоже, это не работает, или я что-то понимаю.

char s1[10]="Youssef";
char *s2
while(*s2!='\0')
    *s2++=*s1++;
printf("%s",s2);

Процесс не возвращается.

1 Ответ

1 голос
/ 09 апреля 2019

Строковые литералы доступны только для чтения.

В любом случае, то, что вы пытаетесь сделать, кажется, вы запутались.

Строковый литерал: char *sl = "string literal";

Anнеинициализированный символьный указатель: char *s2;

Для того, чтобы сделать копию, которая вам нравится, вам сначала нужно выделить память для строки.

Кроме того, вы не можете выполнять арифметику указателей с массивом.Массивы и указатели не одно и то же!

Кроме того, вы должны помнить происхождение указателя s2, так как после увеличения его до завершения копирования вам потребуется сброситьуказатель .. Упражнение: подумайте, что произойдет, если вы сделали копию в функции (желательно с именем mystrcpy`) ...

Полный пример:

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

int main(void) {
  char s1[10]="Youssef";
  char *s2 = malloc(sizeof(char) * (strlen(s1) + 1)); // +1 for the NULL-terminator
  int i = 0;
  char *origin_s2 = s2;
  while(s1[i] != '\0')
    *s2++ = s1[i++];
  *s2 = '\0';
  s2 = origin_s2;
  printf("%s\n", s2);
  return 0;
}

Вывод:

Youssef

PS: Настоятельно рекомендуется проверить, было ли динамическое выделение памяти успешным (проверьте, не является ли возвращаемое значение malloc() не NULL).

...