2015-06-18 6 views
-1

Я пытаюсь найти длину строки без использования функции библиотеки.post и pre increment in for loop. длина строки без функции библиотеки в C

char card[16];     //card number in char array. 
unsigned int cardno[16]={0}; //card number in int array for calculations. 

int i,length=0,len; 
printf("Credit Card Number[without any spaces]: "); 
gets(card); 

for(i=0;card[i]!='\0';i++); 
len=i; 
length=strlen(card); 

printf("%d %d",len,length); 

Но если я ввести номер карты 16 цифр выход 16 17 , но в противном случае [номер карты меньше, чем 16 цифр] и выход такой же. Это эффект до и после приращения или какой-то другой вещи. Пожалуйста, объясните.

+0

Какой язык программирования вы используете? – slartidan

+0

@slartidan Я использую язык C. –

+2

не использовать 'gets()' Он обесценивается, он удаляется в следующем стандарте C, он (среди других проблем) позволяет пользователю переполнять входной буфер. Строго рекомендуем использовать «fgets()». Превышение входного буфера приводит к неопределенному поведению, которое может/приведет к событию сбоя seg – user3629249

ответ

2

Во-первых, вам нужен более длинный массив символов для 16 цифр:

char card[17]; // 16 digits + `\0` 

Тогда попробуйте это:

for(len=0; card[len] != '\0'; len++); 

Не стоит полагаться на стоимость iвне петля.

+0

Это работает. Спасибо. Will yo пожалуйста, объясните, почему это не работает на моем пути? –

+1

см. Комментарий @ user3629249 выше. У вас переполнение абвера. Вы написали символ '\ 0' в карточке [16] при вводе 16-значной строки, в то время как ваш буфер был объявлен char card [16] с последним доступным слотом на карточке [15]. Вторая часть - простая читаемость/понятность. – DrKoch

0

Быстрый ответ использовать fgets() заменить gets()

char *fgets(char *str, int n, FILE *stream) 

п - Это максимальное количество символов для чтения (включая окончательный нуль-символ). Обычно используется длина массива, переданного как str.

Небезопасно использовать функцию gets(), которая может вызвать переполнение стека :), например. если вы хотите ввести 16-значный номер карты на карту [16], нет места для установки «\ 0».

+0

И я предполагаю, что ваш инструмент компиляции не является gcc? Поскольку gcc будет дружелюбно напоминать вам об этом, «функция« получает »является опасной и не должна использоваться». –