- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想编写一个 C 程序,其中有一个包含 10 个字符串的数组,其中每个字符串表示停在第 i 处的汽车的车牌号。随机选择一个点,如果空出,则生成一个随机车牌号并分配给该点,如果被占用,则腾出该点并删除车牌号。然而,程序进入了一个无限循环,这正是我想要的,但它没有打印我为调试程序而编写的任何语句。代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdint.h>
char * generateLicense()
{
srand((unsigned)time(NULL));
char const *code[] = {"AN","AP","AR","AS","BR","CG","CH","DD","DL","DN","GA","GJ","HR","HP","JH","JK","KA","KL","LD","MH","ML","MP","MN","MZ","NL","OD","PB","PY","RJ","SK","TN","TR","TS","UK","UP","WB"};
char const *alphabets[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
char const *numbers[] = {"0","1","2","3","4","5","6","7","8","9"};
char *licensePlate = (char *)malloc(100*sizeof(char));
strcpy(licensePlate,code[rand()%36]);
strcat(licensePlate,"-");
strcat(licensePlate,numbers[rand()%10]);
strcat(licensePlate,numbers[rand()%10]);
strcat(licensePlate,"-");
strcat(licensePlate,alphabets[rand()%26]);
strcat(licensePlate,alphabets[rand()%26]);
strcat(licensePlate,"-");
strcat(licensePlate,numbers[rand()%10]);
strcat(licensePlate,numbers[rand()%10]);
strcat(licensePlate,numbers[rand()%10]);
strcat(licensePlate,numbers[rand()%10]);
return licensePlate;
}
int main()
{
char *messagebody = (char *)malloc(100*sizeof(char));
char *licensePlate = (char *)malloc(100*sizeof(char));
char *currentSpot = (char *)malloc(10*sizeof(char));
char *by = ", by: ";
char *client = "From client 1, ";
char *spots[] = {"00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000"};
int spot;
printf("variables declared\n");
srand((unsigned)time(NULL));
while(1)
{
printf("in while loop\n");
//messagebody = "";
//licensePlate = "";
spot = rand()%10;
//currentSpot = "";
sprintf(currentSpot, "%d", spot);
printf("%s",currentSpot);
strcpy(messagebody,client);
printf("%s",messagebody);
if(spots[spot] == "00-00-00-0000")
{
printf("%s",messagebody);
strcpy(licensePlate, generateLicense());
printf("%s",licensePlate);
strcpy(spots[spot], licensePlate);
strcat(messagebody,"spot occupied: ");
printf("%s",messagebody);
strcat(messagebody,currentSpot);
printf("%s",messagebody);
strcat(messagebody,by);
printf("%s",messagebody);
strcat(messagebody,licensePlate);
printf("%s",messagebody);
}
else
{
printf("%s",messagebody);
strcpy(licensePlate, spots[spot]);
strcpy(spots[spot],"00-00-00-0000");
strcat(messagebody,"spot vacated: ");
printf("%s",messagebody);
strcat(messagebody,currentSpot);
printf("%s",messagebody);
strcat(messagebody,by);
printf("%s",messagebody);
strcat(messagebody,licensePlate);
printf("%s",messagebody);
}
printf("%s",messagebody);
sleep(5);
}
return 0;
}
我也包含了我为调试程序而编写的语句。我在这里做错了什么?
最佳答案
您的程序存在访问冲突:spots
是一个包含十个字符串文字的数组:
char *spots[] = {
"00-00-00-0000",
"00-00-00-0000",
"00-00-00-0000",
...
};
这些文字是不可变的,试图更改它们是一种错误。
相反,定义一个包含十个字符数组的数组来存放您的车牌。您的模式 2-2-2-4 需要空间,空终止符需要一个字符:
char spots[10][14] = {""};
现在 spots
是十个最大的空字符串。长度为 13。你可以测试你是否已经覆盖了它们:
if (*spots[spot] == '\0') ... // string is empty
您的代码还有更多问题:
strcpy
。通过将 14 个字符的缓冲区传递给填充它的函数来直接创建车牌。strcat
序列非常笨拙。考虑使用 snprintf
,它几乎可以一次性创建车牌。这是您的问题的简明实现,仅限于 30 个 parking Action :
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void make_license(char str[])
{
static const char *code[] = {
"AN", "AP", "AR", "AS", "BR", "CG", "CH", "DD", "DL",
"DN", "GA", "GJ", "HR", "HP", "JH", "JK", "KA", "KL",
"LD", "MH", "ML", "MP", "MN", "MZ", "NL", "OD", "PB",
"PY", "RJ", "SK", "TN", "TR", "TS", "UK", "UP", "WB"
};
snprintf(str, 14, "%s-%02d-%c%c-%04d",
code[rand() % 36], rand() % 100,
'A' + rand() % 26, 'A' + rand() % 26,
rand() % 10000);
}
int main()
{
char spots[10][14] = {""};
int n = 30;
srand(time(NULL));
while (n--) {
int spot = rand() % 10;
if (*spots[spot]) {
printf("Car %s leaves spot %d.\n", spots[spot], spot + 1);
*spots[spot] = '\0'; // remove licence plate
} else {
make_license(spots[spot]); // create licence plate
printf("Car %s arrives at spot %d.\n", spots[spot], spot + 1);
}
}
puts("");
puts("Final arrangement");
for (n = 0; n < 10; n++) {
printf("%4d %s\n", n + 1, spots[n]);
}
return 0;
}
如果你想使用动态分配(也许这是分配的要求),你应该使车牌指针指向字符串。将它们初始化为 NULL
,如果您将它们从列表中删除,则释放它们,并确保在完成后释放所有剩余的字符串:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
char *make_license(void)
{
static const char *code[] = {
"AN", "AP", "AR", "AS", "BR", "CG", "CH", "DD", "DL",
"DN", "GA", "GJ", "HR", "HP", "JH", "JK", "KA", "KL",
"LD", "MH", "ML", "MP", "MN", "MZ", "NL", "OD", "PB",
"PY", "RJ", "SK", "TN", "TR", "TS", "UK", "UP", "WB"
};
char *str = malloc(14);
snprintf(str, 14, "%s-%02d-%c%c-%04d",
code[rand() % 36], rand() % 100,
'A' + rand() % 26, 'A' + rand() % 26,
rand() % 10000);
return str;
}
int main()
{
char *spots[10] = {NULL};
int n = 30;
srand(time(NULL));
while (n--) {
int spot = rand() % 10;
if (spots[spot]) {
printf("Car %s leaves spot %d.\n", spots[spot], spot + 1);
free(spots[spot]);
spots[spot] = NULL; // remove licence plate
} else {
spots[spot] = make_license(); // create licence plate
printf("Car %s arrives at spot %d.\n", spots[spot], spot + 1);
}
}
puts("");
puts("Final arrangement");
for (n = 0; n < 10; n++) {
printf("%4d %s\n", n + 1, spots[n] ? spots[n] : "--");
free(spots[n]);
}
return 0;
}
但是您应该清楚地决定采用哪种方法。您的程序介于两者之间:它分配内存,然后尝试对数据进行 strcpy
,就好像您在使用自动内存缓冲区一样。
关于 parking 模拟的C程序没有给出输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45831559/
我将使用什么算法(是否使用蛮力)将尽可能多的汽车(假设所有汽车大小相同)放入 parking 场,以便至少有一个导出(来自容器)并且汽车不能被封锁。或者有人可以向我展示一个以编程方式解决此问题的示例。
我想使用 ggplot 绘制以下场景的网格图,我试图在下图中描绘该场景......我可以使用一些关于如何逻辑地思考该方法的指导。谢谢您的指导。 -- 下面示例图中的每个过道都有奇数边和偶数边 奇数一侧
嘿。 我正在设计一个网站(使用 spring、hibernate 和 postgres),供 parking 场所有者跟踪其 parking 场 parking 位的状态(占用、空置或保留),并且对于
我有一个连接到 Hazelcast 的应用程序。最近我发现对 hazelcast 的请求最终开始变得无响应,因此,我对 Hazelcast 进程进行了线程转储。在分析来自开发和生产环境的线程转储时,我
预计在汽车中使用 GPS。它有速度,但有时以 5 km/h 的低速行驶?:搜索 parking 位它显示速度为 0 - 并且汽车在移动! 如何检测汽车是否已停止? GPS 速度 = 0 并且: 加速度
我想编写一个 C 程序,其中有一个包含 10 个字符串的数组,其中每个字符串表示停在第 i 处的汽车的车牌号。随机选择一个点,如果空出,则生成一个随机车牌号并分配给该点,如果被占用,则腾出该点并删除车
看来,我找不到问题的答案,所以我在这里,首先在 Stackoverflow 上:) 即将提到的If语句树: buttonSzamol.addActionListener(new ActionListe
我们在 parking 场的入口和导出处安装了两个车牌读取器摄像头,在进行检测时会生成一个 CSV 文件,然后自动将其加载到数据库中,入口处还有一个自动操作的屏障由相机的“白名单”生成,然后从数据库内
编写一个程序,在给出以下信息时计算将车停在 parking 场的顾客的 parking 费: a.显示车辆类型的字符:C 代表轿车,B 代表巴士,T 代表卡车 b. 0 到 24 之间的整数,显示车辆
我是一名计算机科学专业的初学者,我们被要求完成一个项目,该项目将随机生成的汽车对象移动到城市 map 网格上随机生成的 parking 位。我为按钮、文本字段和文本区域开发了一个 GUI。一切都按要求
已解决。非常感谢所有提供意见的人。这里有很棒的社区。 我有一项任务,其中部分程序需要计算客户的 parking 费。 收费以小时和 1/2 小时为增量。 确定小时数和分钟数。第 1 分钟到第 30 分
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我注册了几个域名,每个域名都略有不同。 例如, 快车网快车网fastcar.co.uk网站fast-car.co.uk 等.. 我不希望因任何主要搜索引擎的重复内容或垃圾链接而受到惩罚。 我应该将它们
我网上找了很多解决导航方案的问题,均无法用于WordPress3.1之上,总会出现其他问题。而我所讲解的这种方法是最实用、简单的。如果你用的不是本款主题,你同样可以使用此方法。 首先,
我正在尝试线程驻留,并决定构建某种服务。看起来是这样的: public class TestService { private static final Logger logger = Log
我想创建一个应用程序来更快地支付 parking 费。 这个问题更多的是关于我的应用程序的逻辑,以及我需要使用什么工具来创建它。 此时,我每天使用一个 parking 位,并通过网页付费。 我是这样做
我无法同时运行超过 100 个线程。当我进行线程转储时,我注意到其中许多线程处于停放状态,即 parking to wait for (java.util.concurrent.locks.Abst
我正在开发车辆 parking 系统java应用程序。应用程序应该跟踪汽车何时进入 parking 场、何时离开 parking 场、 parking 场的状态,是否已满。该应用程序还应检查 park
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我有一个卡车停车应用程序,在该应用程序中,卡车运输公司可以预订特定日期的某个位置的停车位数量。 我需要帮助来修改查询以查找特定时期的停车位。 我在此过程中有3张桌子: 位置 +------------
我是一名优秀的程序员,十分优秀!