2015-12-15 3 views
1

Я пытаюсь создать программу на C, которая после каждого четного числа добавит «0». Но у меня проблема. Если я вставил, например, только четные числа (5 или более номеров), программа выйдет из строя.добавление 0 char после каждого четного числа в массиве C

Ниже приведена программа, которую я имею прямо сейчас.

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

void main() 
{ 
    int *a, i, n, m; 
    printf("dimensiune="); 
    scanf_s("%d", &n); 
    a = (int*)malloc(n*sizeof(int)); 
    for (i = 0; i < n; i++) 
    { 
     printf("a[%d]=", i + 1); 
     scanf_s("%d", &a[i]); 
    } 
    for (i = 0; i < n; i++) 
    { 
     if (a[i] % 2 == 0) 
     { 
      n++;           
      a = (int*)realloc(a, n*sizeof(int));   
      for (m = n - 1; m > i;m--)     
      {  
       a[m + 1] = a[m];       
      } 
      a[i + 1] = 0;        
      i++;           
     } 
    } 
    printf("\n currently you have %d numbers in this string\n", n); 

    printf("your string \n"); 

    for (i = 0; i < n; i++) 
    { 
     printf("a[%d]=%d\n", i + 1, a[i]); 
    } 
} 
+2

'void main()' должно быть лучше 'int main (void)' или что-то еще. –

+2

[Пожалуйста, просмотрите эту дискуссию о том, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+0

Это решение, спасибо, можете объяснить, почему, в чем разница между void main() и int main (void)? – Gabriel

ответ

1

Изменение:

for (m = n - 1; m > i;m--)     
    {  
    a[m + 1] = a[m];       
    } 

к:

for (m = n - 1; m > i;m--)     
    {  
    a[m] = a[m-1];       
    } 

Я просто проверял, это работает для меня, должно работать для вас.

+0

Я пробовал ваше мнение, отлично работает, спасибо за ваше время, проверяя мой код. :) – Gabriel

0

Я вижу проблемы с этим контуром:

for (m = n - 1; m > i;m--)     
    {  
     a[m + 1] = a[m];       
    } 

При запуске цикла, п число элементов в цикле. Во время первой итерации m является индексом последнего элемента цикла. Итак, m+1 - это последний элемент, создающий переполнение буфера.

0

Спасибо за комментарии. Я решил ошибку, заменяя void main() на int main (void) + решение, предоставляемое Shady Programmer.

+0

Нет, вы этого не сделали, я просто закачал этот код в свой компилятор, и он сбой даже с 'int main (int argc, char ** argv)' посмотрите на мой ответ для правильного исправления. –

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