2017-01-28 2 views
-2

Внутренний цикл while выполняется бесконечно, хотя значение i = n является конечным.
Он компилирует, но показывает ошибку сегментации.Преобразование формата формата даты с dd/mm/yyyy в yyyy/mm/dd с использованием C

Мой код

char s[]="22/02/1997",r[20],temp[20]; 
int i,j,k,z,n; 
for(n=strlen(s)-1; n>=0; n=i) 
{ 
    i=n; 
    k=0; 
    while(s[i]!='/' || s[i]!='-') 
    { 
     temp[k++]=s[i]; 
     i--; 
    } 
    i--; 
    for(z=strlen(temp)-1,j=0; z>=0; z--,j++) 
    { 
     r[j]=temp[z]; 
    } 
    temp[0]='\0'; //empty the array 
} 
printf("%s",r); 
+0

Следуя [Законом Де Моргана] (https://en.wikipedia.org/wiki/De_Morgan's_laws), этот 's [i]! = '/' || s [i]! = '-' 'совпадает с'! (s [i] == '/' && s [i] == '-') ', который будет оцениваться как false (и с этой целью' while'-loop) * only * if 's [i]' равно ''/''и' '-'' в то же время, что никогда не будет *. – alk

+0

В цикле 'while', когда вы достигаете nb дня, нет никакого контроля, чтобы остановить его, поскольку после него нет косой черты. лучше добавить 'i> = 0' –

+0

' j = 0' должно находиться за пределами первого цикла 'for'. –

ответ

3

Есть несколько вопросов, в вашем коде.

  1. j = 0 будет вне всей петли. Это означает, что он должен быть помещен в начало внешней петли.
  2. Правильно присвоено нулевое значение. В любом месте вы не назначили нуль в конце массива.

  3. Ваш ожидаемый ответ yyyy/mm/dd. Но вы не назначили вывод / или -.

  4. В цикле while вы также добавили еще одно условие, которое проверяет значение i больше или равно 0. Если этого условия нет, то он пытается получить доступ к -1-й позиции в массив, он не выделяется. Таким образом, вы получаете ошибку ошибки сегментации.

Наконец-то я исправил все эти ошибки. Попробуйте приведенный ниже код, он будет работать нормально, как вы ожидали.

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char s[]="12/02/1997",r[50],temp[50]; 
    int i,j,k,z,n; 
    j = 0; 
    for(n=strlen(s)-1; n>=0; n=i) 
    { 
     i=n; 
     k=0; 
     while(s[i]!='/' && s[i]!='-' && i >= 0) 
     { 
      temp[k++]=s[i]; 
      i--; 
     } 
     i--; 
     temp[k] = '\0'; 
     for(z=strlen(temp)-1; z>=0; z--,j++) 
     { 
      r[j]=temp[z]; 
     } 
     if(i >= 1) // If the i is greater than 1, then only it have a slash or hypen 
     { 
      r[j++] = s[i + 1]; //Assigning the/or - to the output. 
     } 
     temp[0]='\0'; //empty the array 
    } 
    r[j] = '\0'; 
    printf("%s\n",r); 
} 
+1

Это одна из многих проблем. –

+0

Я проверял это только. Подождите несколько минут. Я уточню свой ответ. – sureshkumar

+0

+2 голосов, а выражение while все еще ** неверно ** Попробуйте выполнить его с 'i = 1' (Seg. Fault) –

1

Внутренний пока цикл выполняется бесконечно ....

Это потому, что вы используете OR (ака ||) вместо AND (ака &&). Поэтому ваше состояние

(s[i] != '/' || s[i] != '-') 

всегда будет правдой. Оно должно быть по крайней мере (см позже код):

(s[i] != '/' && s[i] != '-') 

.... но показывает ошибку сегментации.

Это следствие бесконечного цикла. Поскольку цикл продолжает увеличиваться/уменьшаться k и i, вы в конечном итоге используете индексы вне границы массива, что приводит к сбою.

Дальше вы должны проверить, что i не становится -1, и, для полноты, убедитесь, что k не слишком большой.

Вы также должны убедиться в том, чтобы прекратить temp строки, как вы используете strlen(temp)

Что-то вроде:

while(i>=0 && k<19 &&s[i]!='/' && s[i]!='-') 
{ 
    temp[k++]=s[i]; 
    i--; 
} 
temp[k] = '\0'; // Terminate temp 

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

+0

Контроль в переменной 'k' бесполезен в этом случае. –

+0

@ Meninx- メ ネ ン ッ ク ス - При фиксированном вводе, да, но как только код используется с некоторым динамическим вводом, лучше быть в безопасности и защищать от переполнения. – 4386427

+0

Перечитайте мой комментарий: ** в этом случае **. –

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