提问人:Lucas Bonato Soares 提问时间:11/12/2023 最后编辑:Lucas Bonato Soares 更新时间:11/12/2023 访问量:72
为什么我的一个 C 字符串工作而另一个不工作?[关闭]
Why is one of my strings in C working and the other not? [closed]
问:
我一直在制作一个程序,它接收开始时间、结束时间并输出差值(全部采用 HH:MM 格式)。 我的解决方案是为时间值制作字符串,然后从字符串中提取数字。所以我有 2 个字符串:char entryTime[5] 和 char exitTime[5]。
我做了一个函数来接收 2 个字符串以返回差值,这就是我的问题所在。该函数适用于 exitTime,它很好地分离提取了小时和分钟。但是 entryTime 部分总是给出错误的输出。 我开始用 printf 填充函数以输出所有涉及的变量,并将其追溯到字符串本身。出于某种原因,函数作为 entryTime[5] 的参数接收的字符串为空。exitTime[5] 字符串以相同的方式接收,作为函数上的参数,很好。 此外,出于某种原因,当使用 printf 输出 entryTime 字符串的最后 2 个字符时,它工作正常,即使字符串本身在打印时是空的。
创建字符串: 为字符串赋予值: 调用函数:char entryTime[5], exitTime[5];
scanf("\n%[^\n]", entryTime);
scanf("\n%[^\n]", exitTime);
calculateParkingTime(entryTime, exitTime, &dH);
这是函数中无法正常工作的部分:
//entryTime
printf("\n >%s", entryTime); //outputs nothing
aux[0] = entryTime[0];
aux[1] = entryTime[1];
hAux = atoi(aux);
printf("\n-%i\n", hAux); //outputs 0
aux[0] = entryTime[3];
aux[1] = entryTime[4];
mAux = atoi(aux);
printf("\n-%i\n", mAux); //outputs correctly
mAux += hAux*60;
T1 = mAux;
这是工作正常的 exitTime 部分,用于比较:
//exitTime
printf("\n>%s", exitTime); //outputs correctly
aux[0] = exitTime[0];
aux[1] = exitTime[1];
hAux = atoi(aux);
printf("\n-%i\n", hAux); //outputs correctly
aux[0] = exitTime[3];
aux[1] = exitTime[4];
mAux = atoi(aux);
printf("\n-%i\n", mAux); //outputs correctly
mAux += hAux*60;
T2 = mAux;
答:
要以该格式读取时间,目标数组必须至少有 6 个字节:5 个字节用于字符,一个额外的字节用于 null 终止符。HH:MM
同样,临时数组必须至少有 3 个字节,并且必须在 处设置一个 null 终止符。但请注意,不需要这个中间数组,因为会在第一个非数字字符处停止转换。另请注意,您可以使用 .aux
aux[2]
atoi()
sscanf()
"%d:%d"
一个似乎起作用而另一个不起作用的原因是您的行为未定义,这意味着程序可能以不可预测的方式显示或不起作用。
这是修改后的版本:
#include <stdio.h>
int main() {
char entryTime[10];
char exitTime[10];
int hAux, mAux, T1, T2;
printf("Enter entry and exit times (HH:MM): ");
if (scanf("%9s %9s", entryTime, exitTime) != 2) {
fprintf(stderr, "invalid input\n");
return 1;
}
if (sscanf(entryTime, "%d:%d", &hAux, &mAux) != 2) {
fprintf(stderr, "invalid format: %s\n", entryTime);
return 1;
}
T1 = hAux * 60 + mAux;
if (sscanf(exitTime, "%d:%d", &hAux, &mAux) != 2) {
fprintf(stderr, "invalid format: %s\n", exitTime);
return 1;
}
T2 = hAux * 60 + mAux;
printf("elapsed time: %d minutes\n", T2 - T1);
return 0;
}
评论
aux
horaEntrada
char entryTime[5] and char exitTime[5]
fgets
scanf
fgets