В настоящее время я занимаюсь курсом на 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 тоже?
Нет. + И & не для конкатенации в C. В любом случае, в C вы обычно используете strncat
для конкатенации char *
(s), но ваш вопрос, похоже, касается печати. Для этого вам нужно сделать что-то вроде
printf("The average score is %d\n", grade / 2);
,
символ? например printf("The average score is %d\n", grade / 2 , " ..Good grade!" );
printf("The average score is %d %s\n", grade / 2 , " ..Good grade!");
Обратите внимание на «% s» в строке формата.
Итак, у вас есть два вопроса, замаскированных под один вопрос.
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 байт в конец результата.
printf( "start of string " A_STRING_MACRO " end of string\n");
и после предварительной обработки он будет выглядеть как "printf (" начало строки, что было в конце макроса строки \n "), но нет оператора конкатенации во время выполнения. В знаке java +
используется для конкатенации строк, например:
System.out.println("hello"+","+" "+"World");
+
используется для работы с артефактами, а вместе с ним +
перегружается, чтобы объединить строки. +
предполагается выполнять только артефакты, а не перегружать конкатенацию. printf("String <format specifier>",arg1,arg2,...);
для более подробной информации о печати. Кликните сюда
У вас есть концепция java, но все языки не одинаковы в синтаксисе, поэтому мое предложение для вас - это первое чтение операции ввода языка C, в языке C и используется для получения адреса памяти переменной, поэтому вы не можете используйте его для работы с двумя строковыми типами, в java '+' можно использовать для кодирования двух строк, это язык высокого уровня, поэтому вы можете это сделать, но в c это невозможно,% d используется в c, чтобы получить переменную из памяти. Таким образом, ваш код вывода будет:
'printf ("средний балл равен% d", (класс)/2);
В вашем примере
printf("The average score is "& grade / 2 & "");
оператор &
используется для получения адреса памяти любой переменной, поэтому, когда вы пытаетесь напечатать только обычную переменную int, это &
не требуется.
вы можете сделать что-то подобное
printf("The average score is %d", ( grade/2 ));
%d
используемый в printf, используется для соответствия переменной, которую вы предоставили
&
используется здесь в инфиксной позиции, поэтому он не принимает адрес чего-либо - он является побитовым и оператором.
&
in scanf
и printf