добавление 2 символов в один символ * - PullRequest
0 голосов
/ 24 сентября 2018

поэтому, если у меня есть

char a = 'a';
char b = 'b';
char* combination = a + b;

, где результат должен быть

combination = "ab"

как бы я это сделал?Я на 99% уверен, что оператор «+» здесь не сработает, но я не уверен, что мне следует делать вместо этого.Я новичок в C, так что извините за то, как тривиален этот вопрос!

edit ** возможно ли это без использования массива?значение без использования скобок []

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Просто определите массив и расположите в нем два символа, а затем завершите его последним нулевым символом, чтобы сформировать правильную строку C:

const char a = 'a';
const char b = 'b';
const char my_string[] = { a, b, '\0' };
printf("The string is '%s'\n", my_string);

В ответ на комментарии (которыеЯ не понимаю, но я здесь, чтобы помочь, хе), вот извращенный способ написания, который устраняет скобки.

uint32_t memory;
char *p = (char *) &memory;
*p++ = a;
*p++ = b;
*p-- = '\0';
printf("the string is '%s'\n", --p);

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

0 голосов
/ 25 сентября 2018

добавление 2 символов вместе, чтобы сформировать один символ * ... как бы я это сделал?

Прямой способ сделать это, так как C99 ниже, который использует соединениебуквальный . @ haccks , @ unwind

char a = 'a';
char b = 'b';

//                   v-------------------v--- compound literal
char* combination1 = (char[]) {a, b, '\0'};

printf("<%s>\n", combination1);

combination1 действует до конца блока.

Я99% уверены, что оператор «+» здесь не сработает,

OP - правильный, + - неправильный подход.


- этоВозможно ли это без использования массива?значение без использования скобок []

Это любопытное ограничительное требование.

Код может выделять память и затем назначать.

char *concat2char(char a, char b) {
  char *combination = malloc(3);
  if (combination) {
    char *s = combination;
    *s++ = a;
    *s++ = b;
    *s = '\0';
  }
  return combination;
}

// Sample usage
char *combination2 = concat2char('a', 'b');
if (combination2) {
  printf("<%s>\n", combination2);
  free(combination2);  // free memory when done
}

Использование3 члена struct выглядит как опция, но переносимый код не полагается на s3, будучи упакованным .

struct {
  char a, b, n;
} s3 = {a, b, '\0' };

// Unreliable to form a string, do not use !!
char* combination3 = (char *) &s3;

printf("<%s>\n", combination);
0 голосов
/ 24 сентября 2018

Вам необходимо установить целевой массив, который как минимум на один элемент больше, чем количество символов в конечной строке:

char str[3]; // 2 characters plus string terminator

str[0] = a;
str[1] = b;
str[2] = 0; // you'll sometimes see that written as str[2] = '\0'

Ни операторы +, ни = не определены для строкиоперации.Вам придется использовать библиотечные функции str* (strcat, strcpy, strlen и т. Д.) Для строковых операций.

РЕДАКТИРОВАТЬ

В C строка представляет собой последовательность символьных значений, оканчивающихся 0-значным байтом - строка "hello" являетсяпредставлены последовательностью символов {'h', 'e', 'l', 'l', 'o', 0} (иногда вы увидите '\0' вместо простого 0).Строки хранятся в массивах char.Строковые литералы, такие как "hello", хранятся в массивах char, так что они видны в течение всего жизненного цикла программы, но не предназначены для изменения - попытка обновить содержимое строкового литерала приводит к неопределенному поведению (код можетсбой, операция может просто не завершиться успешно, код может вести себя как ожидалось и т. д.).

За исключением случаев, когда он является операндом операторов sizeof или унарных &, или является строковым литералом, используемым для инициализации массива символов в объявлении, выражением типа "N-элемент T "будет преобразован (" распад ") в выражение типа" указатель на T ", а значением выражения будет адрес первого элемента.Поэтому, когда мы имеем дело со строками, мы обычно имеем дело с выражениями типа char * - однако это не означает, что char * всегда ссылается на строку .Он может указывать на один символ, который не является частью строки, или он может указывать на последовательность символов, которые не имеют терминатора 0.

Итак, давайте начнем со строкового литерала, например "hello".Он будет храниться «где-то» как массив:

+---+---+---+---+---+---+
|'h'|'e'|'l'|'l'|'o'| 0 |
+---+---+---+---+---+---+

Когда вы пишете что-то вроде

char *str = "hello";

адрес первого элемента массива, которыйсохраняет "hello" записывается в указатель переменная str:

     +---+      +---+---+---+---+---+---+
str: |   | ---> |'h'|'e'|'l'|'l'|'o'| 0 |
     +---+      +---+---+---+---+---+---+

Хотя вы можете читать каждый str[i], вы не должны писать в него (технически, поведение не определено).С другой стороны, когда вы пишете что-то вроде:

char str[] = "hello";

str создается как массив , а содержимое строкового литерала копируетсядля массива:

+---+---+---+---+---+---+
|'h'|'e'|'l'|'l'|'o'| 0 |
+---+---+---+---+---+---+

     +---+---+---+---+---+---+
str: |'h'|'e'|'l'|'l'|'o'| 0 |
     +---+---+---+---+---+---+

Размер массива зависит от размера инициализатора, поэтому он будет иметь ширину 6 элементов (+1 для ограничителя строки).Если массив будет содержать результат конкатенации или операции печати, то он должен быть достаточно большим, чтобы вместить результирующую строку плюс терминатор 0, и массивы C не будут автоматически увеличиваться при добавлении к ним содержимого.Итак, если вы хотите объединить две 3-символьные строки вместе, тогда целевой массив должен иметь размер не менее 7 элементов:

char result[7];
char *foo = "foo";
char *bar = "bar";

strcpy( result, foo ); // copies contents of foo to result
strcat( result, bar ); // appends the contents of bar to result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...