Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t将负输入设置为零。如何设置负数组?_C - Fatal编程技术网

Can';t将负输入设置为零。如何设置负数组?

Can';t将负输入设置为零。如何设置负数组?,c,C,以下代码适用于所有正输入,但负值是假的。如果最初将负值设置为0,则会起作用,因为它们确实会相加。最后举例说明 #include <stdio.h> /* Necessary header */ #define MAX_RESPONDENTS 6 #define MIN_RESPONSE_VALUE -100

以下代码适用于所有正输入,但负值是假的。如果最初将负值设置为0,则会起作用,因为它们确实会相加。最后举例说明

#include <stdio.h>                                                             /* Necessary header */
#define MAX_RESPONDENTS 6
#define MIN_RESPONSE_VALUE -100                                                /* Abbreviated MiRV */
#define MAX_RESPONSE_VALUE 86                                                   /* Abbreviated MaRV */
#define RESPONSE_VALUE 187                                                      /* Equals |(MiRV)| + or - |(MaRV)| + 1 */
#define STOP 3
#define BREAK 1

int main(void)
{
    CountRating();

    return 0;
}

CountRating()
{
    int ratingCounters, rating[RESPONSE_VALUE] = {0}, Counter, response;

    for (ratingCounters = 0; ratingCounters < MAX_RESPONDENTS;)
    {
        int response = ratingCounters, stop = STOP;
        printf("Enter a integer rating between %d and %d for the product: ", MIN_RESPONSE_VALUE, MAX_RESPONSE_VALUE);
        scanf("%d", &response);

        if (response <= MAX_RESPONSE_VALUE && response >= MIN_RESPONSE_VALUE)
            stop = STOP;
        else
        {
            int stopElse = stop;
            if (stopElse < BREAK)
                break;
            else
            {
                do
                {
                    printf("\nNot within range. Try again.\nYou have %d more attempts before program outputs total:", stop);
                    scanf("%d", &response);
                    printf("\n");
                    --stop;
                    if (stop < BREAK)
                    break;
                } while (response > MAX_RESPONSE_VALUE || response < MIN_RESPONSE_VALUE);
            }   if (stop < BREAK)
                break;
        }
        ++rating[response];
        ++ratingCounters;

    }
    printf("\nRating            Number of Responses\n");
    printf("------            -------------------");

    for (Counter = MAX_RESPONSE_VALUE; Counter >= MIN_RESPONSE_VALUE; --Counter)
    {
        printf("\n%3d%24d", Counter, rating[Counter]);
    }
}

数组的索引始终从零开始。不应为数组传递负索引。如果希望有负索引,请在索引中添加一个常量


在示例代码中,可以将-MIN\u RESPONSE\u值添加到索引中,因此如果要访问索引
k
,则访问
评级[k-MIN\u RESPONSE]
,评级是一个大小为187的数组。您正在索引负值,这意味着C在数组开始之前访问内存,并打印存储在那里的任何垃圾值。您只能合法地访问0到186之间的值,因此只要在访问和存储评级时向索引中添加100即可。这样,数字-100对应于索引0,-99对应于索引1,等等。

您的代码分配给数组的负索引。这通常是不好的-您只有0:RESPONSE_VALUE-1的保留内存,写入该范围之外的任何内容都将产生不可预测的后果。您有两个常规选项。一种是将您的范围MIN\u RESPONSE\u VALUE:MAX\u RESPONSE\u VALUE映射为0:(MAX\u RESPONSE\u VALUE-MIN\u RESPONSE\u VALUE)。也就是说,每当你对以下情况进行评级时,减去最小响应值:

++rating[response-MIN_RESPONSE_VALUE];
另一个是重新定位响应,给它一个新的零点。这将使您无需一直减去MIN_RESPONSE_值,但可能会让读者感到困惑:

rating -= MIN_RESPONSE_VALUE;

在for循环之前执行此操作。这样做之后,评级[MIN\u RESPONSE\u VALUE]是一个有效的指标,即使它是负的。

实际上,负的指标是完全可以接受的。问题是索引进入了堆栈上专用于数组的内存之外的区域。更改
分级[-1]
会更改阵列外部的堆栈,从而损坏它。难怪那里的值没有用
评级[RESPONSE_VALUE]={0}
初始化为零,它们同样在数组之外,并向您显示堆栈上的一些数据。

我花了一些时间,但我得到了它。谢谢

#include <stdio.h>                                                             /* Necessary header */
#define MAX_RESPONDENTS 6
#define MIN_RESPONSE_VALUE -100                                                /* Abbreviated MiRV */
#define MAX_RESPONSE_VALUE 86                                                   /* Abbreviated MaRV */
#define RESPONSE_VALUE 187                                                      /* Equals |(MiRV)| + or - |(MaRV)| + 1 */
#define STOP 3
#define BREAK 1
#define DOUBLE_RESPONSE_VALUE 374

int main(void)
{
    CountRating();

    return 0;
}

CountRating()
{
    int ratingCounters, rating[DOUBLE_RESPONSE_VALUE] = {0}, Counter, response;

    for (ratingCounters = 0; ratingCounters < MAX_RESPONDENTS;)
    {
        int response = ratingCounters, stop = STOP;
        printf("Enter a integer rating between %d and %d for the product: ", MIN_RESPONSE_VALUE, MAX_RESPONSE_VALUE);
        scanf("%d", &response);

        if (response <= MAX_RESPONSE_VALUE && response >= MIN_RESPONSE_VALUE)
            stop = STOP;
        else
        {
            int stopElse = stop;
            if (stopElse < BREAK)
                break;
            else
            {
                do
                {
                    printf("\nNot within range. Try again.\nYou have %d more attempts before program outputs total:", stop);
                    scanf("%d", &response);
                    printf("\n");
                    --stop;
                    if (stop < BREAK)
                    break;
                } while (response > MAX_RESPONSE_VALUE || response < MIN_RESPONSE_VALUE);
            }   if (stop < BREAK)
                break;
        }
        if (response < 0)
            ++rating[response + abs(RESPONSE_VALUE)];
        else
            ++rating[response + abs(RESPONSE_VALUE)];
        ++ratingCounters;

    }
    printf("\nRating            Number of Responses\n");
    printf("------            -------------------");

    for (Counter = MAX_RESPONSE_VALUE; Counter >= MIN_RESPONSE_VALUE; --Counter)
    {
        printf("\n%3d%24d", Counter, rating[Counter + (RESPONSE_VALUE)]);
    }
}
#包含/*必要的标题*/
#定义最大值为6
#定义最小响应值-100/*缩写为MiRV*/
#定义最大响应值86/*缩写MaRV*/
#定义响应_值187/*等于|(MiRV)|+或-|(MaRV)|+1*/
#定义停止3
#定义中断1
#定义双_响应_值374
内部主(空)
{
计数();
返回0;
}
计数()
{
int评级计数器,评级[双_响应_值]={0},计数器,响应;
对于(评级计数器=0;评级计数器<最大值;)
{
int响应=额定计数器,停止=停止;
printf(“为产品输入介于%d和%d之间的整数评级:”,最小响应值,最大响应值);
scanf(“%d”,响应(&R));
如果(响应=最小响应值)
停止=停止;
其他的
{
int stopElse=stop;
if(stoppelse最大响应|值|响应<最小响应|值);
}如果(停止<中断)
打破
}
如果(响应<0)
++评级[响应+abs(响应值)];
其他的
++评级[响应+abs(响应值)];
++分级计数器;
}
printf(“\n额定响应数\n”);
printf(“--------------”);
用于(计数器=最大响应值;计数器>=最小响应值;--计数器)
{
printf(“\n%3d%24d”,计数器,评级[计数器+(响应值)];
}
}

它失败了,因为C中没有负数组索引。
评级[0]
是数组中的第一个元素。您需要将值映射到正数组索引。如果范围为-100到100,则需要将其移动100,以便索引的范围为0-200。你所做的就像是要买一本书之前的100页纸。无论出于何种目的,它们都不存在。他们是其他人的页面0-100,当然不是您的页面-100-->0
#include <stdio.h>                                                             /* Necessary header */
#define MAX_RESPONDENTS 6
#define MIN_RESPONSE_VALUE -100                                                /* Abbreviated MiRV */
#define MAX_RESPONSE_VALUE 86                                                   /* Abbreviated MaRV */
#define RESPONSE_VALUE 187                                                      /* Equals |(MiRV)| + or - |(MaRV)| + 1 */
#define STOP 3
#define BREAK 1
#define DOUBLE_RESPONSE_VALUE 374

int main(void)
{
    CountRating();

    return 0;
}

CountRating()
{
    int ratingCounters, rating[DOUBLE_RESPONSE_VALUE] = {0}, Counter, response;

    for (ratingCounters = 0; ratingCounters < MAX_RESPONDENTS;)
    {
        int response = ratingCounters, stop = STOP;
        printf("Enter a integer rating between %d and %d for the product: ", MIN_RESPONSE_VALUE, MAX_RESPONSE_VALUE);
        scanf("%d", &response);

        if (response <= MAX_RESPONSE_VALUE && response >= MIN_RESPONSE_VALUE)
            stop = STOP;
        else
        {
            int stopElse = stop;
            if (stopElse < BREAK)
                break;
            else
            {
                do
                {
                    printf("\nNot within range. Try again.\nYou have %d more attempts before program outputs total:", stop);
                    scanf("%d", &response);
                    printf("\n");
                    --stop;
                    if (stop < BREAK)
                    break;
                } while (response > MAX_RESPONSE_VALUE || response < MIN_RESPONSE_VALUE);
            }   if (stop < BREAK)
                break;
        }
        if (response < 0)
            ++rating[response + abs(RESPONSE_VALUE)];
        else
            ++rating[response + abs(RESPONSE_VALUE)];
        ++ratingCounters;

    }
    printf("\nRating            Number of Responses\n");
    printf("------            -------------------");

    for (Counter = MAX_RESPONSE_VALUE; Counter >= MIN_RESPONSE_VALUE; --Counter)
    {
        printf("\n%3d%24d", Counter, rating[Counter + (RESPONSE_VALUE)]);
    }
}