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



内部 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]='';  //empty the array
}
printf("%s",r);   

代码中存在多个问题。

  1. j = 0将位于所有循环之外。这意味着它必须放置在外部 for 循环的起点。
  2. 您未正确处理分配空值。在任何地方,您都没有在数组末尾分配 null。

  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] = '';
        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]='';  //empty the array
    }
    r[j] = '';
    printf("%sn",r); 
}

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

那是因为您使用 OR(又名 || )而不是 AND(又名 && )。所以你的条件

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

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

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

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

这是无限循环的结果。由于循环不断递增/递减ki,你最终会在数组边界之外使用索引,从而导致崩溃。

此外,您应该检查i是否不会变得-1,并且为了完整起见,请检查k不会变得太大。

您还应该确保在使用strlen(temp)时终止temp字符串

像这样:

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

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

相关内容

  • 没有找到相关文章

最新更新