c - c 中的 rand() 出现问题

标签 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:“==”:“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。 当我选择中断并停止调试时,我检查错误列表,但没有出现任何内容。我不知道问题出在哪里。

最佳答案

多个问题:

  1. 您无法使用 == 运算符进行字符串比较。您必须改用 strcmpstrncmp 库函数之一,例如

    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”<的地址,这几乎肯定是不一样的)。
  2. 就像不能使用 == 来比较字符串一样,也不能使用 = 来分配它们。发生的情况是,您将字符串文字("XS""S" 等)的地址分配给变量 < em>大小。不幸的是,这会覆盖 malloc 调用返回的指针值,从而导致内存泄漏(稍后会详细介绍)。使用库函数 `strcpy` 或 `strncpy` 来分配字符串:

    strcpy( size, "S" );
    
  3. 没有理由动态分配任何 pricesize 甚至 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;
    
  4. 代码

    for (j = 0; j < 8; j++)
    {
        *name = (char)(rand() % 26 + 97);
    }
    没有达到你的预期;它只会多次覆盖 name 中的第一个字符。它还假定特定于 ASCII 的编码。将其更改为

    for (j = 0; j < 7; j++)
    {
        name[j] = (rand() % 26 + 'a');
    }
    name[j] = 0;
    C 字符串必须以 0 结尾(序列中的最后一个字符必须为 0 值)。因此,一个 8 元素的 char 数组可以存储最多 7 个字符的字符串。
  5. 代码如下

    *size = (char)(rand() % 5);
    if (size == 0)
    {
        size = "XS";
    
    真的很糟糕的juju;您尝试将 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/

相关文章:

c++ - 处理列表时应该使用指针吗?

c++ - 默认参数问题(c++)

c - 在 C 中生成一个随机的 32 位十六进制值

c++ - 是否可以对高负载网络服务器使用硬件多路分解?

c - 在C中读取空白行

c - 如何正确使用免费数据

c++ - rand() 即使使用 srand( time(NULL) ) 也不起作用

c - pthread_mutex_timedlock() 过早退出而不等待超时

c - * 等同于 C 中的 [] 吗?

c - C中的偏置随机数生成器函数