строковый массив strcpy - PullRequest
       30

строковый массив strcpy

4 голосов
/ 26 февраля 2011
char copy, array[20]

    printf("enter ..."):
    scanf("%s", array);

    if (strlen(array) > 20 ) 
      { 
       strcpy(copy, array....); 

что мне нужно сделать, чтобы получить только первые 20 символов, если длина ввода превышает 20 символов

Ответы [ 7 ]

5 голосов
/ 26 февраля 2011
char array[20+1];
scanf("%20s", array);

Проблема решена.

3 голосов
/ 26 февраля 2011

Ваш вопрос неясен, так как код имеет мало смысла или вообще не имеет смысла. Ваш ввод не может быть длиннее 20 символов, так как получаемый массив состоит всего из 20 символов. Если пользователь вводит больше, ваша программа выдаст неопределенное поведение. Итак, главная проблема здесь не в ограничении копии, а в ограничении ввода.

Однако ваш вопрос, похоже, касается копирования строк ограниченной длины. Если это то, что вам нужно, то, к сожалению, в стандартной библиотеке нет выделенной функции для этой цели. Многие реализации предоставляют нестандартную функцию strlcpy, которая делает именно это. Так что, либо проверьте, обеспечивает ли ваша реализация strlcpy, либо самостоятельно внедрите strlcpy.

Во многих случаях вы можете увидеть советы по использованию strncpy в таких случаях. В то время как можно побить strncpy к работе для этой цели, в действительности strncpy не предназначен для использования таким образом. Использование strncpy в качестве функции копирования строк ограниченной длины всегда является ошибкой. Избегайте этого.

1 голос
/ 26 февраля 2011

Кроме того, вам не нужно использовать strcpy для чтения только 20 символов (и вам не нужно будет включать strings.h):

char c;
for( i = 0; i < 20; i++ ) {
    c = getchar();
    if (c != '\n') array[i] = c;
    else break;
}
array[i+1] = '\0';

Не забудьте объявить массив как char array[21], чтобы убедиться, что '\ 0' будет включено.

1 голос
/ 26 февраля 2011

Используйте strncpy вместо strcpy.Это все, что нужно сделать.(Внимание: strncpy не не обнуляет строку назначения, если она достигает своего предела.)

РЕДАКТИРОВАТЬ: Я недостаточно внимательно прочитал вашу программу,Вы теряете уже при вызове scanf, если пользовательский ввод превышает 20 символов.Вы должны звонить fgets вместо этого.(Лично я считаю, что * scanf никогда не следует использовать - это только верхушка айсберга в отношении проблем, которые они вызывают.) Кроме того, copy имеет место только для одного символа, а не для двадцати;но я собираюсь предположить, что это опечатка с вашей стороны.

0 голосов
/ 26 февраля 2011

Вам нужно изменить ваш вызов scanf (), а не вызов strcpy ():

char copy[20], array[20];
printf("enter....");
scanf(%20s",array); // read a maximum of 20 characters
strcpy(copy, array);
0 голосов
/ 26 февраля 2011
 strncpy (copy, array, 20);

делает свое дело. За исключением того, что строка НЕ ​​будет заканчиваться нулем, если она будет> 20 символов!

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

0 голосов
/ 26 февраля 2011

Используйте strncpy .Удостоверьтесь, что null завершает пункт назначения.

...