我正在尝试编写一个模拟睡衣采摘的程序。主要功能需要将睡衣的数量和睡衣的种类作为参数(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:&#39; ==&#39; :&#39; char *&#39;不同的间接水平与&#39; int&#39;
第14,18和22行我也得到了这个错误:
警告C4130:&#39; ==&#39; :对字符串常量的地址进行逻辑运算
还有这个:
警告C4244:&#39;功能&#39; :来自&time;&lt; time_t&#39; to&#39; unsigned int&#39;,可能会丢失数据
还有这个:
警告C4100:&#39; argc&#39; :未参考的形式参数
我不知道如何修复它们,请帮忙!
修改 代码现在看起来像这样:
#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。 当我选择break并停止调试时,我检查错误列表并且没有任何内容出现。我不知道问题所在。
答案 0 :(得分:2)
多个问题:
render
运算符进行字符串比较。您必须使用其中一个==
或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"
等)的地址分配给变量 size 。这会有覆盖"S"
调用返回的指针值的不幸影响,导致内存泄漏(稍后会详细介绍)。使用库函数`strcpy`或`strncpy`来分配字符串:malloc
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);
}
中的第一个字符。它还假定特定于ASCII的编码。将其改为name
C字符串必须以0结尾(序列中的最后一个字符必须为0值)。因此,for (j = 0; j < 7; j++)
{
name[j] = (rand() % 26 + 'a');
}
name[j] = 0;
的8元素数组可以存储最多7个字符的字符串。
char
是真的坏juju;您尝试将*size = (char)(rand() % 5);
if (size == 0)
{
size = "XS";
变量用于完全不同的目的。它在size
可以存储整数值的意义上“有效”,并且在分配字符串时会立即复制它,但它是坏样式。使用不同的变量或切换表达式的结果,如下所述:*size
在我看来,在继续这个项目之前,您需要花一些时间阅读基本的C参考手册。
答案 1 :(得分:1)
您无法指定char
变量的指针。 c中的char
类型不是字符串类型,实际上c中没有字符串类型,你不能使size = "X"
,因为它是指向"X"
的指针。
你可以试试这个
const char *size;
switch (rand() % 5)
{
case 0:
size = "XS";
break;
case 1:
size = "S";
break;
case 2:
size = "M";
break;
case 3:
size = "L";
break;
case 4:
size = "XL";
break;
default:
size = "Completely Unexpected";
break;
}
你还有很多其他问题
对于单个值,请勿malloc()
,并且不要转换malloc()
的返回值。
当您printf("%f\n", price);
调用未定义的行为时,因为price
是指针。
您无法将c中的字符串与==
运算符进行比较,您需要strcmp()
,所以
if (argv[2] == "cheap")
必须是
if (strcmp(argv[2], "cheap") == 0)
与0
进行比较,因为strcmp()
用于排序字符串,因为如果第一个字符串小于,等于或大于第二个字符串,它返回一个负数,零或正数的整数字母顺序。
c语言,不像php或python语言,变量类型不重要,你可以在python中做到这一点
x = 3;
print(x)
x = "Hello"
print(x)
哪个可以正常工作,在c变量中是strogly类型,所以你不能将类型为int
的变量赋予const char *
。