使用C语言将日期格式从dd/mm/yyyy转换为yyyy/mm/dd
内部while循环通过有限的使用C语言将日期格式从dd/mm/yyyy转换为yyyy/mm/dd,c,date,segmentation-fault,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=st
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);
代码中存在多个问题
j=0
将在所有循环之外。这意味着它必须被放置在外部for循环的起始位置yyyy/mm/dd
。但是您没有将/
或-
分配给输出#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);
}
#包括
#包括
int main()
{
字符s[]=“12/02/1997”,r[50],临时[50];
int i,j,k,z,n;
j=0;
对于(n=strlen(s)-1;n>=0;n=i)
{
i=n;
k=0;
而(s[i]!='/'和&s[i]!='-'&&i>=0)
{
温度[k++]=s[i];
我--;
}
我--;
温度[k]='\0';
对于(z=strlen(temp)-1;z>=0;z--,j++)
{
r[j]=温度[z];
}
if(i>=1)//如果i大于1,则只有它有斜杠或hypen
{
r[j++]=s[i+1];//将/或-赋值给输出。
}
temp[0]='\0';//清空数组
}
r[j]='\0';
printf(“%s\n”,r);
}
内部while循环无限执行
这是因为您使用OR(也称为|
)而不是AND(也称为&&
)。那么你的情况如何
(s[i] != '/' || s[i] != '-')
永远都是真的。它至少应该是(参见后面的代码):
。。。。但显示分割错误
这是无限循环的结果。由于循环不断递增/递减k
和i
,最终将使用数组边界之外的索引,从而导致崩溃
此外,您应该检查i
是否变为-1
,为了完整性,检查k
是否变大
在使用strlen(temp)
比如:
while(i>=0 && k<19 &&s[i]!='/' && s[i]!='-')
{
temp[k++]=s[i];
i--;
}
temp[k] = '\0'; // Terminate temp
while(i>=0&&k遵循此s[i]!='/'|s[i]!='-'
与!(s[i]='/'&&s[i]='-')
相同,只有在s[i]的情况下,while
-循环才会求值为false
同时等于'/'
和'-'
,这种情况永远不会发生。在中,当到达当天的nb时,
循环中,没有控制来停止它,因为后面没有斜杠。最好将i>=0
j=0
添加到循环的第一个之外。因为你要重用de>temp
数组您不能通过仅将第一个字符更改为空字符来清空它。下面的答案是否解决了您的查询?我只是在检查它。请稍等几分钟。我将更新我的答案。+2次投票,而while控制表达式仍然不正确请尝试使用I=1
执行它(Seg.Fault)如果我设置I=1,它会给出堆栈粉碎错误。因此需要在该变量上添加控件:I>=0
@Meninx-メネンックス : 我错过了一个条件检查,而我犯了错误。那就是我必须用0检查条件。现在看我的答案。我被更新了。变量k
上的控件在这种情况下是无用的。@Meninx-メネンックス - 对于固定输入,是的,但是一旦代码与一些动态输入一起使用,最好是安全的,并防止溢出。
while(i>=0 && k<19 &&s[i]!='/' && s[i]!='-')
{
temp[k++]=s[i];
i--;
}
temp[k] = '\0'; // Terminate temp