Как работает конкатенация в C?

1

В настоящее время я занимаюсь курсом на C в школе. После того, как я слишком привык к Java, я, похоже, не понимаю, как выполняется конкатенация на C. Поиск в Google не помогает, так как большая часть кода, который я видел, о том, как конкатенировать фактические строки, такие как "Hello" + "World".

В Java, скажем, я хотел бы объединить арифметическое выражение в строке, я мог бы просто просто использовать оператор +, но в C, единственное место, где я могу увидеть что-то знакомое, - это что-то вроде этого:

int grade;
scanf("%d", &grade);

Я могу понять, что переменная grade принимается как входная, но если я хотел выполнить арифметическую операцию с этой переменной с помощью операторов + или &, я получаю ошибки. Вот пример того, что я пытался сделать:

printf("The average score is "& grade / 2 & "");

Что возвращает ошибку, даже когда я использую оператор +, но отлично работает в Java:

System.out.println("The average score is " + grade / 2 + "");

Я могу понять, что они разные языки, но не являются + и операторы & должны также использоваться для конкатенации в C тоже?

  • 2
    читать концепцию строк формата C, похоже, это вас смущает?
  • 1
    В C нет типа 'String', только массивы байтов, интерпретируемые как символы. Конец строки обозначается нулевым байтом. Таким образом, всякий раз, когда вы хотите «объединить строки», вы «объединяете» два байтовых массива. Это может быть сделано путем явного выделения нового фрагмента памяти достаточной емкости и перемещения туда содержимого исходных массивов. И явно free () исходные массивы, если это необходимо.
Теги:
string
concatenation

5 ответов

4

Нет. + И & не для конкатенации в C. В любом случае, в C вы обычно используете strncat для конкатенации char * (s), но ваш вопрос, похоже, касается печати. Для этого вам нужно сделать что-то вроде

printf("The average score is %d\n", grade / 2);
  • 0
    Благодаря Эллиот, что если у меня есть другие части строки , чтобы добавить к выходу я все еще использовать , символ? например printf("The average score is %d\n", grade / 2 , " ..Good grade!" );
  • 1
    Вам также нужно использовать правильную строку формата , второй будет printf("The average score is %d %s\n", grade / 2 , " ..Good grade!"); Обратите внимание на «% s» в строке формата.
Показать ещё 1 комментарий
2

Итак, у вас есть два вопроса, замаскированных под один вопрос.

C отформатированные процедуры ввода-вывода (printf и fprintf) вообще не работают как подпрограммы Java I/O. Вместо того, чтобы конкатенировать элементы в строку, вы используете строку формата, которая имеет заполнители для данных переменных, а затем передает переменные данные в качестве дополнительных аргументов:

printf( "The average score is %d\n", grade/2 );

%d - спецификатор преобразования; он сообщает printf что есть дополнительный аргумент, имеющий тип int, и что он должен быть отформатирован как последовательность цифр. Обратите внимание, что printf полагается на спецификаторы преобразования в строке формата, чтобы рассказать, сколько и какие типы дополнительных аргументов ожидать; если вы передадите аргумент, что неправильный тип для данного спецификатора преобразования или не передайте достаточно аргументов, тогда вы получите что-либо от искаженного вывода до полного сбоя. Если вы передаете больше аргументов, чем требуется для строки формата, тогда дополнительные аргументы оцениваются, но в противном случае игнорируются.

Обратитесь к вашему справочному руководству по C для описания всех различных спецификаторов преобразования и того, как они используются.

Что касается конкатенации строк, C не имеет типа строки как такового, и не имеет оператора конкатенации строк 1. В C "строка" представляет собой последовательность символов, заканчиваемую 0-значным байтом. Строки хранятся в виде массивов char, таких как:

char h[] = "hello";
char w[] = "world";

Массив h содержит значения {'h', 'e', 'l', 'l', 'o', 0}, а w содержит {'w', 'o', 'r', 'l', 'd', 0}. Чтобы объединить строки вместе, вам нужно выделить целевой буфер, который достаточно велик, чтобы удерживать обе строки. Если у вас есть компилятор, который поддерживает массивы переменной длины, вы можете:

char result[ strlen(h) + strlen(w) + 2 ]; 

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

char *result = malloc( sizeof *result * (strlen(h) + strlen(w) + 2) );

+ 2 необходим для пространства между "привет" и "миром" и заканчивающимся 0 байтом.

Когда у вас есть целевой буфер, вы можете использовать комбинацию strcpy и strcat для записи на него:

strcpy( result, h );
strcat( result, " " ); // note " " instead of ' '; the second argument *must* be a string
strcat( result, w );

или вы можете использовать sprintf (который работает как printf, но записывает результат в массив char вместо потока):

sprintf( result, "%s %s", h, w );

Для strcat чтобы strcat работал, в целевом буфере должна быть строка с нулевым завершением, поэтому мы начали с strcpy, который добавит 0 байт в конец скопированной строки. Пустая строка содержит один 0-значный байт, поэтому мы можем также сделать что-то вроде:

result[0] = 0;       // or memset( result, 0, sizeof result ), which sets the whole buffer to 0
strcat( result, h );
strcat( result, " " );
strcat( result, w );

strcat ищет завершающий 0 байт и перезаписывает его с началом следующей строки, а затем добавляет 0 байт в конец результата.


1. Строковые литералы, которые появляются рядом друг с другом, объединены во время фазы предварительной обработки компиляции, поэтому вы можете написать что-то вроде printf( "start of string " A_STRING_MACRO " end of string\n"); и после предварительной обработки он будет выглядеть как "printf (" начало строки, что было в конце макроса строки \n "), но нет оператора конкатенации во время выполнения.
2

В знаке java + используется для конкатенации строк, например:

             System.out.println("hello"+","+" "+"World"); 

Его просто грубый способ показать конкатенацию строк. Этот самый принцип возможен в java, потому что оператор + используется для работы с артефактами, а вместе с ним + перегружается, чтобы объединить строки.

Но в знаке C + предполагается выполнять только артефакты, а не перегружать конкатенацию.

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

printf("String <format specifier>",arg1,arg2,...);
для более подробной информации о печати. Кликните сюда

0

У вас есть концепция java, но все языки не одинаковы в синтаксисе, поэтому мое предложение для вас - это первое чтение операции ввода языка C, в языке C и используется для получения адреса памяти переменной, поэтому вы не можете используйте его для работы с двумя строковыми типами, в java '+' можно использовать для кодирования двух строк, это язык высокого уровня, поэтому вы можете это сделать, но в c это невозможно,% d используется в c, чтобы получить переменную из памяти. Таким образом, ваш код вывода будет:

'printf ("средний балл равен% d", (класс)/2);

0

В вашем примере

printf("The average score is "& grade / 2 & "");

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

вы можете сделать что-то подобное

printf("The average score is %d", ( grade/2 ));

%d используемый в printf, используется для соответствия переменной, которую вы предоставили

  • 2
    & используется здесь в инфиксной позиции, поэтому он не принимает адрес чего-либо - он является побитовым и оператором.
  • 0
    @ sepp2k: по тому, как он задал вопрос, я подумал, что он запутался с & in scanf и printf
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню