【问题标题】:Couting up cstring elements of an array计算数组的 cstring 元素
【发布时间】:2021-07-18 14:24:59
【问题描述】:

我正在做一个关于使用结构和指针来管理洗车中的一些东西的项目,我必须计算给定队列完成洗车所需的时间,可以这么说,其中“almindelig”(普通)和 luksus(豪华),每个时间分别为 10 和 20 分钟。这是我目前的程序,在我创建“计数”函数的地方,我得到的输出是一个未定义的整数。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

//Jeg laver to structs her, en for bil, der indeholder nummerplade, maerke og type af bil
struct bil
{
    char *Nummerplade;
    char *Maerke;
    char *Type;
};

//Det andet er for koen, hvorved der bliver lavet et array med pointere *bi[100] hvorved dataen der bliver indtastet bliver opbevaret i
struct koe
{
    struct bil *bi[100];
    int antal;
};
//Her bruger jeg en funktion fra programmet Koe3.c fra forelæsning, som jeg har
// omskrevet således at det fungerer til mit program, hvor jeg bruger struct bil
void ind(struct koe *k,char *N,char *M, char *T)
{
    int antalelementer=k->antal;
    struct bil *b;
    b=malloc(sizeof(struct bil));
    b->Nummerplade=N;
    b->Maerke=M;
    b->Type=T;
    k->bi[antalelementer]=b;
    k->antal++;
}
//Her er det en simpel printf funktion, der tager udgangspunkt i struct bil b, hvorved der vil være data der er indlæst i
void udskrivpunkt(struct bil b)
{
    printf("(%s, %s, %s)\n",b.Nummerplade,b.Maerke, b.Type);
}
//Jeg bruger en omskrevet version af Koe3.c fra forelæsning, hvor jeg har omskrevet den til at kunne bruge struct bil i stedet
void udskrivkoe(struct koe k)
{
    int i;
    for(i=0;i<k.antal;i++)
        udskrivpunkt(*(k.bi[i]));
    printf("\n");
}
//Jeg bruger en omskrevet version af koe3.c fra forelæsningen.
struct bil ud(struct koe *k)
{
   k->antal--;
   struct bil element=*(k->bi[0]);
   int i;
   free(k->bi[0]);
   for (i=0;i<k->antal;i++)
     k->bi[i]=k->bi[i+1];
   return element;
}
//Her laver jeg et simpelt for loop, der bruger struct koe k til at gennemløbe arrayet, hvorved der er indlæst data om bilerne, og den returnerer k
//som er antallet af elementer i arrayet, jeg kan derfor kalde på den senere i programmet,
//for at finde ud af hvor mange elementer der er indlæst med struct koe k i arrayet.
int totalkoe(struct koe k)
{
    int i;
    for(i=0;i<k.antal;i++)
    return(k.antal);
}

int totaltid(struct koe k)
{
    struct bil b;
    int i,counter1, counter2, sum;
    for(i=0;i<k.antal;i++)
        if(b.Type="Almindelig")
            counter1++;
        else    
            counter2++;

    sum=10*counter1+20*counter2;
    return(sum);
}


//I min main funktion kalder jeg blot på de funktioner og structs jeg har defineret tidligere i programmet
int main(void) {

    int n, i;
    struct bil b;
    struct koe k;
    k.antal=0;
    
    //Jeg kalder på min ind funktion, hvorved jeg kan indlæse noget data jeg indtaster i programmet, og som der bliver gemt i arrayet bi[100]
    printf("\nOpgave 1: Registrerer biler der ankommer i koeen\n\n");
    printf("Alle biler i koeen:\n");
    ind(&k,"AV96888","VW","Almindelig");
    ind(&k,"KD65656","Audi", "Luksus");
    ind(&k, "AX21878", "Ford", "Almindelig");
    ind(&k, "CN32323", "VW", "Almindelig");
    ind(&k, "NB21214", "Ford", "Luksus");
    ind(&k, "UM21878", "Ford", "Almindelig");
    ind(&k, "AV54361", "Tesla", "Almindelig");
    udskrivkoe(k);

    printf("\nOpgave 2: Udtage den første bil i koeen\n\n");
    printf("Den foerste bil bliver nu vasket og fjernes fra koeen:\n");
    b=ud(&k);
    udskrivkoe(k);
    printf("\nOpgave 3: Få information om hvor mange biler der er i koeen\n");
    printf("\nDer er %d biler i koe\n\n",totalkoe(k));
    printf("%d",totaltid(k));




    return 0;
}

我很难排除故障的代码部分是这部分:

int totaltid(struct koe k)
{
    struct bil b;
    int i,counter1, counter2, sum;
    for(i=0;i<k.antal;i++)
        if(b.Type="Almindelig")
            counter1++;
        else    
            counter2++;

    sum=10*counter1+20*counter2;
    return(sum);
}

输出为未定义的整数。

很抱歉,很长一段文字,但我认为您需要整个程序才能更好地理解/帮助。任何意见表示赞赏。

【问题讨论】:

  • 请忽略所有注释掉的东西,让我更好地记住每个函数的作用
  • if(b.Type="Almindelig") 这是一个分配(一个=),并且总是会评估为一个真实的条件。始终在启用警告的情况下进行编译、阅读、尝试理解和修复这些警告。
  • 请注意,== 也不是比较字符串的正确方法(strcmp 是)。您是否考虑过对 C 进行更系统的介绍,例如reading a book?
  • 我知道我没有提到你得到随机数的真正原因,只是启用警告并让编译器告诉你(一些未初始化的东西)。
  • 是的,我试过读一本书,我在介绍 c 编程 atm,因此为什么有些事情我不确定

标签: c string function pointers struct


【解决方案1】:

如@dratenik 所述,您必须在函数中使用 strcmp。检查代码:

int totaltid(struct koe k)                                                                                 
{                                                                                                          
    struct bil b;                                                                                          
    int i,counter1, counter2, sum;                                                                         
    for(i=0;i<k.antal;i++) {                                                                               
        char *Type = k.bi[i]->Type;                                                                        
        if(!strcmp(Type,"Almindelig"))                                                                     
            counter1++;                                                                                    
        else                                                                                               
            counter2++;                                                                                    
    }                                                                                                      
                                                                                                           
    sum=10*counter1+20*counter2;                                                                           
    return(sum);                                                                                           
}                                                                                                          
          

【讨论】:

  • 这也返回未定义。我尝试返回计数器 1 和计数器 2,但在计数器 1 中,我认为它返回的是 counter1 的地址,因为它返回 32767,而计数器 2 返回一个未定义的数字
  • 你是对的,有一个核心。我已经修复了代码,但我不确定代码的目的,我无法理解。希望我的新答案更好。
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 2016-05-19
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多