- 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!