Показаны сообщения с ярлыком C. Показать все сообщения
Показаны сообщения с ярлыком C. Показать все сообщения

Как узнать версию C-компилятора на Mac OS X

$ cc --version
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix

Функция strlen в C/C++

Прототип функции

C:
Defined in header <string.h>
size_t strlen( const char *str );

C++:
Defined in header <cstring>
std::size_t strlen( const char* str );

str - указатель на null-terminated строку
Функции возвращает количество символов перед завершающим нулем. Завершающий нулевой символ не входит в длину строки. Он является служебным символом, для обозначения завершения Си-строки.

В C++ есть альтернативная функция char_traits::length

Не путайте размер массива, который содержит строку и длину строки. Например:
char mystr[100]="test string"; 
В данной строке массив имеет размер 100 символов, но строка в этом массиве имеет длину всего 11 символов. Таким образом, если выполнится оператор sizeof(mystr), ответ будет 100, а если — функция strlen(mystr), ответ 11.

Функция strcpy в C/C++

strcpy — функция стандартной библиотеки языка программирования Си, для копирования нуль-терминированной строки (включая нуль-терминатор) в заданный буфер.


Прототип, описанный в заголовочном файле string.h:
char * strcpy ( char * destination, const char * source );
  • source - указатель на исходную C строку с завершающим нулевым символом
  • destination - указатель на массив (буфер назначения)
В версии С99 к параметрам source и destination применен квалификатор restrict.

Существует мнемоническое правило, позволяющее легко запомнить, к чему относится const. Надо провести черту через "*", если const слева, то оно относится к значению данных; если справа — к значению указателя.

Функция возвращает значение указателя destination.
Тот же самый прототип может быть записан как:
char *strcpy (char *dst, const char *src);
Вообще считается что звездочка не относится к имени параметра или функции поэтому некоторые пишут ее отдельно от имени как в первом случае.

Копирование включает в себя и копирование завершающего null-символа.
Чтобы избежать переполнения размер массива на который указывает destination должен быть достаточно величины чтобы вместить в себя строку source, включая завершающий null-символ. И массив destination не должен перекрываться в памяти с source. Если символьные массивы  source и destination перекрываются, поведение функции strcpy() не определено.


Пример 0:
char str[80];
strcpy(str, "привет");


Пример 1:
#include <stdio.h>
#include <string.h>

int main() {
 char str1[] = "Sample string";
 char str2[40];
 char str3[40];
 strcpy(str2, str1);
 strcpy(str3, "copy successful");
 printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
 return 0;
}

Вывод 1:
str1: Sample string
str2: Sample string
str3: copy successful


Пример 2:
#include <string.h>
#include <stdio.h> /* для printf() */

int main() {
 char *str = "образец строки";
 char buf[32]; // буфер размером больше строки
 memset(buf, 0, sizeof(buf)); // очистка буфера для вывода
 // Другой способ, если не требуется равенство нулю всех байтов
 // *buf = '\0';
 printf("строка: \"%s\"\n", str);
 strcpy(buf, str);
 printf("буфер после копирования: \"%s\"\n", buf);
 return 0;
}

Вывод 2:
строка: "образец строки"
буфер после копирования: "образец строки"


Пример 3:
#include <stdio.h>
#include <string.h>

int main()
{
   char src[40];
   char dest[100];
  
   memset(dest, '\0', sizeof(dest));
   strcpy(src, "This is tutorialspoint.com");
   strcpy(dest, src);

   printf("Final copied string : %s\n", dest);
   
   return(0);
}

Вывод 3:
Final copied string : This is tutorialspoint.com


Пример 4:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char A[] = "Take the test.";
    char *B = malloc(strlen(A) + 1);
    strcpy(B, A);
    A[0] = 'M';
    printf("A = %s\nB = %s", A, B);

    return 0;
}

Вывод 4:
A = Make the test.
B = Take the test.

Поскольку функция не проверяет длину строки и размер буфера, она не должна использоваться для работы с данными, размер которых неизвестен, во избежание переполнения буфера destination.

Вместо strcpy рекомендуется использовать стандартную функцию strncpy (добавляя нуль-терминатор при необходимости!) или не входящие в стандарт функции strlcpy или strncpy_s.


Дополнительная информация:


Константы EXIT_SUCCESS и EXIT_FAILURE

EXIT_SUCCESS alias для 0
EXIT_FAILURE alias для 1