2013-05-18 2 views
1

При написании программы я заполняю записи массива символов цифрами. После этого длина, рассчитанная для массива без нуля, верна, но для массива, начинающегося с нуля, равна нулю!Неопределенное поведение программы

Почему этот результат подходит? Я не могу интерпретировать свою ошибку !?

int main() 
{ 
    int number_of_terms,no,j,i; 
    char arr[100]; 
    char c; 
    scanf("%d",&number_of_terms); 
    for(i=0;i<number_of_terms;i++) 
    { 
     j=0; 
     while(c!='\n') 
     { 
      scanf("%d",&arr[j]); 
      if(c=getchar()=='\n') 
      break; 
      j++; 
     } 
     printf("Length is:%d\n",strlen(arr)); 
    } 
    return 0; 
} 

for eg if i input my array elements as 4 5 
lenght is 2 
and if my array elements as 0 5 
length is 0.. 
+3

И 'c = getchar() == '\ n'' равно' c = (getchar() == '\ n') ', который вы, вероятно, не хотите. – Lennart

+0

независимо от того, что вы заявляете, пожалуйста, дайте ему стимулятор. не оставляйте его плавающим. может произойти сбой ввода, который оставит ваши переменные в старом состоянии (которое не определено для вашего кода). –

ответ

2

Вы используете «% D» в вашем спецификатора формата, который производит целое, и вы передаете в адрес массива символов. Это точно так же, как ваш заголовок говорит о неопределенном поведении. В частности, нулевое значение будет занимать 4 ячейки в вашей строке и будет записывать нуль во все эти значения. Поскольку символ с нулевым значением является маркером конца, вы получаете строку нулевой длины. Однако в другой архитектуре второй символ, вероятно, вызовет сбой ...

Если вы хотите хранить целые числа в массиве, вы должны использовать int arr[...];. Если вы хотите хранить символы, используйте «% c».

+0

Должно быть, какой-нибудь современный компилятор не понимает, что? – Cubic

+0

Последние версии (в течение последних 10 лет или около того) gcc, при условии, что разрешено достаточно предупреждений, скажут вам, что вы используете неправильный формат. Другие компиляторы могут или нет. –

2

Вы копируете значение 0 в массив. Это выражает символ '\ 0', который используется для прекращения строк. Вы хотите скопировать символ «0» (имеет значение 48, см. Таблицу ascii).

Изменение% d на% c для интерпретации ввода имеет символ вместо десятичного.

scanf("%c",&arr[j]); 

Кроме того, ваша "строка" в arr не равна нулю прекращается. После всех символов вашей строки вы должны закончить строку значением 0 (здесь будет десятичное значение). strlen нуждается в нем, поскольку он определяет длину строки путем перемещения массива и подсчета до тех пор, пока не найдет 0.

Смежные вопросы