在c中遇到rand()问题

时间:2015-05-19 15:54:07

标签: c pointers random argv argc

我正在尝试编写一个模拟睡衣采摘的程序。主要功能需要将睡衣的数量和睡衣的种类作为参数(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并停止调试时,我检查错误列表并且没有任何内容出现。我不知道问题所在。

2 个答案:

答案 0 :(得分:2)

多个问题:

  1. 您无法使用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]的地址,这几乎肯定是不一样的)。
  2. 就像您无法使用"cheap"来比较字符串一样,您无法使用==来分配字符串。发生的事情是您将字符串文字(="XS"等)的地址分配给变量 size 。这会有覆盖"S"调用返回的指针值的不幸影响,导致内存泄漏(稍后会详细介绍)。使用库函数`strcpy`或`strncpy`来分配字符串:

    malloc
  3. 没有理由动态分配strcpy( size, "S" ); price甚至size中的任何一个。只需将它们声明为任何正常变量:

    name
  4. 代码

    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个字符的字符串。
  5. 以下代码

    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;
 }

你还有很多其他问题

  1. 对于单个值,请勿malloc(),并且不要转换malloc()的返回值。

  2. 当您printf("%f\n", price);调用未定义的行为时,因为price是指针。

  3. 您无法将c中的字符串与==运算符进行比较,您需要strcmp(),所以

    if (argv[2] == "cheap")
    

    必须是

    if (strcmp(argv[2], "cheap") == 0)
    

    0进行比较,因为strcmp()用于排序字符串,因为如果第一个字符串小于,等于或大于第二个字符串,它返回一个负数,零或正数的整数字母顺序。

  4. c语言,不像php或python语言,变量类型不重要,你可以在python中做到这一点

    x = 3;
    print(x)
    x = "Hello"
    print(x)
    

    哪个可以正常工作,在c变量中是strogly类型,所以你不能将类型为int的变量赋予const char *