使用C将日期格式格式从dd / mm / yyyy转换为yyyy / mm / dd

时间:2017-01-28 06:50:25

标签: c date segmentation-fault

内部while循环无限地执行,但i = n的值是有限的 它编译但显示分段错误。

我的代码

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);   

2 个答案:

答案 0 :(得分:3)

您的代码中存在多个问题。

  1. j = 0将在所有循环之外。这意味着它必须放在外部for循环的开始。
  2. 您没有正确处理assign null值。在任何地方,你都没有在数组末尾指定null。

  3. 您的预期答案是yyyy/mm/dd。但是您没有将/-分配给输出。

  4. 在while循环中,你还添加了一个条件,即检查i的值是否大于或等于0.如果没有这个条件,那么它会尝试访问第-1个位置在数组中,它没有被分配。所以,只有你得到分段错误。

  5. 最后我纠正了这些错误。尝试以下代码,它将按预期正常工作。

    #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 :(得分:1)

  

内部while循环无限执行....

这是因为你使用OR(又名||)代替AND(又名&&)。所以你的情况

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

永远是真的。它至少应该是(见后面的代码):

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

....但显示分段错误。

这是无限循环的结果。由于循环保持递增/递减ki,因此最终将使用数组边界之外的索引导致崩溃。

此外,您应检查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

注意:你的第二个循环也存在一些问题,但是一旦你解决了上述问题,你就可以开始研究那个部分了。