【问题标题】:C - Members of different arrays share pointersC - 不同数组的成员共享指针
【发布时间】:2021-02-25 14:28:09
【问题描述】:

我是 C 新手,我正在使用 printf、scanf 函数和变量。我制作了一个程序,它从用户那里获取一些变量并将它们存储在 2 个不同的数组中。但由于某种原因,不同数组的 2 个成员共享指针,因此值。 这是我的代码:

setlocale(LC_ALL,"Turkish");
double odev[2];
double quiz[2];
printf("Dönem sonu not hesaplama sistemine hoş geldiniz.\n");
for(short i=0;i <= 2;i++)//Ödev notunu 3 kez almasi için
{
    while(true)
    {
        char girdi[20];
        printf("%d. ödev notunu giriniz:",i+1);
        scanf("%s", girdi);
        bool floatKontrol = true;
        int girdiuzunluk = strlen(girdi);
        for(short j = 0;j < girdiuzunluk && floatKontrol;j++)
        {
            if(!(girdi[j] == ',' || isdigit(girdi[j])))
            {
                if(girdi[j] == '.')
                {
                    girdi[j] = ',';
                }
                else
                {
                    floatKontrol = false;
                    printf("Girmiş olduğunuz değer anlaşılamamıştır. Lütfen pozitif sayılar giriniz.\n");
                }
            }
        }

        if(floatKontrol)
        {
            odev[i] = strtod(girdi, NULL);
            printf("%f\n",odev[i]);
            if(odev[i]>100)
            {
                printf("100'ün üzerinde değer girilemez. Lütfen tekrar deneyin.\n");
            }
            else{
                break;
            }
        }
    }
}

for(short i=0;i <= 2;i++)
{
    while(true)
    {
        char girdi[20];
        printf("%d. quiz notunu giriniz:",i+1);
        scanf("%s", girdi);
        bool floatKontrol = true;
        int girdiuzunluk = strlen(girdi);
        for(short j = 0;j < girdiuzunluk && floatKontrol;j++)
        {
            if(!(girdi[j] == ',' || isdigit(girdi[j])))
            {
                if(girdi[j] == '.')
                {
                    girdi[j] = ',';
                }
                else
                {
                    floatKontrol = false;
                    printf("Girmiş olduğunuz değer anlaşılamamıştır. Lütfen pozitif sayılar giriniz.\n");
                }
            }
        }

        if(floatKontrol)
        {
            quiz[i] = strtod(girdi, NULL);
            if(quiz[i]>100)
            {
                printf("100'ün üzerinde değer girilemez. Lütfen tekrar deneyin.\n");
            }
            else{
                break;
            }
        }
    }
}
printf("%f\n",odev[0]);
printf("%f\n",odev[1]);
printf("%f\n",odev[2]);
printf("%f\n",quiz[0]);
printf("%f\n",quiz[1]);
printf("%\n",quiz[2]);

用户输入和控制台输出:

> Dönem sonu not hesaplama sistemine hoÅY geldiniz.
>1. ödev notunu giriniz:23
>23,000000
>2. ödev notunu giriniz:48
>48,000000
>3. ödev notunu giriniz:31
>31,000000
>1. quiz notunu giriniz:4
>2. quiz notunu giriniz:5
>3. quiz notunu giriniz:6  
>6,000000  
>48,000000  
>31,000000  
>4,000000  
>5,000000  
>6,000000

当我编写程序来写入数组成员的指针时,输出是这样的:

>Dönem sonu not hesaplama sistemine hoÅY geldiniz.
>1. ödev notunu giriniz:23
>23,000000
>2. ödev notunu giriniz:48
>48,000000
>3. ödev notunu giriniz:31
>31,000000
>1. quiz notunu giriniz:4
>2. quiz notunu giriniz:5
>3. quiz notunu giriniz:6  
>000000000061FDD0  
>000000000061FDD8  
>000000000061FDE0  
>000000000061FDC0  
>000000000061FDC8  
>000000000061FDD0  

我的 IDE:Code::Blocks 20.03

【问题讨论】:

    标签: arrays c pointers


    【解决方案1】:

    在 C 中,您必须在声明数组时指定元素的数量,而不是最大索引

    您声明了double odev[2];,因此只有odev[0]odev[1] 可用,而odev[2] 超出范围。 quiz[2] 也超出范围。

    分配足够的元素,如

    double odev[3];
    double quiz[3];
    

    或者(如果你觉得这更容易理解)

    double odev[2+1];
    double quiz[2+1];
    

    消除这个错误。

    【讨论】:

    • 我认为它的工作方式类似于 Java 数组的工作方式。但是我觉得很奇怪,C 让你定义一个未分配的成员而不抛出异常。
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多