我正在尝试编写一个模拟挑选睡衣的程序。主函数需要获取睡衣的数量和睡衣的种类作为参数(3 种睡衣:便宜的、常规的和昂贵的)。每件睡衣都有名称、尺寸和价格,程序将向用户显示作为参数输入的睡衣数量和种类。然后它会随机分配 10 件睡衣,如下所示: 不同的名字 不同尺寸(XS、S、M、L、XL) 价格: 便宜:10-30$ 普通:30-60$ 昂贵:60-732.5$ 然后,用户将能够选择他喜欢的睡衣,直到达到他在参数中输入的数字。 我写了这段代码:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
int main(int argc, char** argv)
{
srand(time(NULL));
int i, j;
char* size = (char*)malloc(sizeof(char) * 3);
float* price = (float*)malloc(sizeof(float));
char* name = (char*)malloc(sizeof(char) * 8);
printf("The number of pyjamas is: %s and the kind of pyjamas is: %s\n", argv[1], argv[2]);
for (i = 0; i < 10; i++)
{
if (argv[2] == "cheap")
{
*price = (float)(rand() % 20 + 10);
}
if (argv[2] == "regular")
{
*price = (float)(rand() % 30 + 30);
}
if (argv[2] == "expensive")
{
*price = (float)(rand() % (6725 + 600)) / 10;
}
*size = (char)(rand() % 5);
if (size == 0)
{
size = "XS";
}
if (size == 1)
{
size = "S";
}
if (size == 2)
{
size = "M";
}
if (size == 3)
{
size = "L";
}
if (size == 4)
{
size = "XL";
}
for (j = 0; j < 8; j++)
{
*name = (char)(rand() % 26 + 97);
}
printf("%f\n", price);
printf("%s\n", size);
printf("%s\n", name);
}
printf("%d", price);
system("PAUSE");
return (0);
}
我还没有完成挑选部分,但我所做的部分无法编译。
我在第 31、35、39 和 43 行收到此错误:
警告 C4047:“==”:“char *”与“int”的间接级别不同
我在第 14、18 和 22 行也收到此错误:
警告 C4130: '==' : 对字符串常量地址进行逻辑运算
和这个:
警告 C4244:“function”:从“time_t”转换为“unsigned int”,可能会丢失数据
和这个:
警告 C4100:'argc':未引用的形式参数
我不知道如何修复它们,请帮忙!
编辑: 代码现在如下所示:
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <malloc.h>
int main(int argc, char** argv)
{
int i, j;
char* size = (char*)malloc(sizeof(char) * 3);
float* price = (float*)malloc(sizeof(float));
char* name = (char*)malloc(sizeof(char) * 8);
int* choice = (int*)malloc(sizeof(char) * 10);
srand((unsigned int)time(NULL));
printf("You entered %d parameters: The number of pyjamas is: %s and the kind of pyjamas is: %s\n", argc, argv[1], argv[2]);
for (i = 0; i < 10; i++)
{
if (strcmp(argv[2], "cheap")==0)
{
*price = (float)(rand() % 20 + 10);
}
if (strcmp(argv[2], "regular")==0)
{
*price = (float)(rand() % 30 + 30);
}
if (strcmp(argv[2], "expensive")==0)
{
*price = (float)(rand() % (6725 + 600)) / 10;
}
switch (rand() % 5)
{
case 0:
strcpy(size, "XS");
break;
case 1:
strcpy(size, "S");
break;
case 2:
strcpy(size, "M");
break;
case 3:
strcpy(size, "L");
break;
case 4:
strcpy(size, "XL");
break;
}
for (j = 0; j < 7; j++)
{
name[j] = (rand() % 26 + 'a');
}
name[j] = 0;
printf("%f\n", price);
printf("%s\n", size);
printf("%s\n", name);
}
printf("Please pick %s pyjamas\n", argv[1]);
if (choice)
{
for (i = 0; i < 10; i++)
{
scanf("%d", (choice + i));
}
}
free(size);
free(price);
free(name);
system("PAUSE");
return (0);
}
我尝试运行它,但得到的只是黑色的 cmd 屏幕和此错误Q6.exe 中 0x5018FB53 (msvcr120d.dll) 处未处理的异常:0xC0000005:访问冲突读取位置 0x555C3A44。 当我选择中断并停止调试时,我检查错误列表,但没有出现任何内容。我不知道问题出在哪里。
最佳答案
多个问题:
- 您无法使用
==
运算符进行字符串比较。您必须改用strcmp
或strncmp
库函数之一,例如
您的代码中发生的情况是,您正在比较两个指针值(存储在if (strcmp( argv[2], "cheap") == 0 ) { price = rand() % 20 + 1; // no need for the cast, and we'll talk about // allocating price below }
argv[2]
中的地址和字符串文字“cheap”<的地址
,这几乎肯定是不一样的)。 -
就像不能使用
==
来比较字符串一样,也不能使用=
来分配它们。发生的情况是,您将字符串文字("XS"
、"S"
等)的地址分配给变量 < em>大小。不幸的是,这会覆盖malloc
调用返回的指针值,从而导致内存泄漏(稍后会详细介绍)。使用库函数 `strcpy` 或 `strncpy` 来分配字符串:
strcpy( size, "S" );
-
没有理由动态分配任何
price
、size
甚至name
。只需将它们声明为任何普通变量即可:
char name[4]; // result of rand() % 26 + 97 will never be more than 3 digits char size[3]; // size will never hold a string longer than 2 characters float price;
-
代码
没有达到你的预期;它只会多次覆盖for (j = 0; j < 8; j++) { *name = (char)(rand() % 26 + 97); }
name
中的第一个字符。它还假定特定于 ASCII 的编码。将其更改为
C 字符串必须以 0 结尾(序列中的最后一个字符必须为 0 值)。因此,一个 8 元素的for (j = 0; j < 7; j++) { name[j] = (rand() % 26 + 'a'); } name[j] = 0;
char
数组可以存储最多 7 个字符的字符串。 -
代码如下
真的很糟糕的juju;您尝试将*size = (char)(rand() % 5); if (size == 0) { size = "XS";
size
变量用于完全不同的目的。它“有效”是因为*size
可以存储整数值,并且在分配字符串时您会立即复制它,但这是坏风格。使用不同的变量或切换表达式的结果,如下所示:
switch( rand() % 5 ) { case 0: strcpy( size, "XS" ); break; case 1: strcpy( size, "S" ); break; // add code for remaining cases }
在我看来,在继续这个项目之前,您需要花一些时间阅读基本的 C 引用手册。
关于c - c 中的 rand() 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30330446/