Сомнения в используемой функции strcpy - PullRequest
1 голос
/ 21 августа 2011

Я использую два буфера, которые имеют unsigned char, и когда я использовал функцию strcpy, возникает ошибка компиляции, которая говорит «недопустимое преобразование беззнакового char * в char *». Может кто-нибудь сказать, пожалуйста, какая разница между неподписанным буфером и подписанным буфером на выходе? Это программа, которую я пробовал.

        main()
        {
                unsigned char buff[20] = "Michael";
                unsigned char dst[20] = "Jackson";
                strcpy(buff,dst);
                printf("The string is %s\n",buff);

        }

Теперь, когда я произвожу параметры, передаваемые в strcpy в (char *), эта программа отлично работает, как показано ниже

        main()
        {
                unsigned char buff[20] = "Michael";
                unsigned char dst[20] = "Jackson";
                strcpy((char *)buff,(char *)dst);
                printf("The string is %s\n",buff);

        }

2-й вопрос: создает ли приведение типов к типу char * в строковой функции какие-либо проблемы?

Пожалуйста, дайте мне знать, если вам нужно больше информации.

Ответы [ 3 ]

6 голосов
/ 21 августа 2011

Вы можете просто изменить:

unsigned char buff[20] = "Michael";
unsigned char dst[20] = "Jackson";

на

char buff[20] = "Michael";
char dst[20] = "Jackson";

Если логически представить, строка не может быть подписана или не подписана, это не числовое значение для обработкитаким образом, это просто массив символов, и вы должны объявить и использовать его так.

Почему вы получаете ошибку?
strcpy имеет прототип:

char *strcpy(char *restrict s1, const char *restrict s2);

И то, что вы передаетеunsigned char*, когда вызывается функция, выполняется проверка типа параметра, и компилятор обнаруживает, что вы не вызываете функцию с правильными параметрами типа, и, следовательно, он жалуется на это. Когда вы применяете приведение, аргументы функции совпадают и, следовательно,сборник проходит.

Приводит ли приведение типов к типу char в строковой функции какие-либо проблемы? *
Нет, в этом случае это не так.
Хотя это и делаетбольше смысла изменить использование unsigned char по причинам, указанным выше в ответе.

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

5 голосов
/ 21 августа 2011

То, как вы его используете, должно быть хорошо.

Но вы не должны использовать массивы unsigned char с функциями обработки строк.В C-строках есть массивы char, а не unsigned char.Поскольку при переходе на strcpy отбрасывается квалификатор unsigned, компилятор предупреждает.

Как правило, не делайте вещи без знака, когда вам не нужно.

0 голосов
/ 21 августа 2011

strcpy хочет char *, просто и понятно. Примените свои буферы к char *, и все будет в порядке. Тогда есть вся проблема безопасности с использованием strcpy во-первых ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...