c - 数据结构中灵活的可变长度

标签 c data-structures

我需要编写一个程序来确定学生的平均水平。如果学生的姓氏是 Константинопольский,我不明白如何灵活地执行 char name

struct student {
  char group[5];
  char name[21];
  char exam[5];
  char test[12];
};

void student_average_scope(FILE *file) {
  struct student this;
  int i;
  int sum;

  while (fgets((char *)&this, sizeof(this), file) != NULL) {
    this.name[20] = '\0';
    this.exam[4] = '\0';

    for (i = 0, sum = 0; i < 4; i++) {
      sum += this.exam[i] - '0';
    }

    printf("%s - %.1f\n", this.name, (float)sum / 4);
  }

  fclose(file);
}

我的学生名单:

4273 Багров Д. С. 5454 знззз
4273 Нуйикн А. А. 4333 знзнз
4272 Галкин Г. А. 5445 ззззз
4273 Иванов А. А. 3433 знззн
4272 Козлов И. И. 4443 ззззз
4272 Козлов В. И. 4444 знззз
4272 Бобров П. Н. 4543 знззз
4272 Шмелев И. И. 4443 знззн

最佳答案

应@Jongware 的要求,这是一种基于 scanf 系列的解决方案,如果输入的结构相对恒定,这是一种非常方便的解析字符串的方法。

给定输入字符串

4273 Багров Д. С. 5454 знззз

对于这个例子,我假设我们所追求的常量模式是一个 int 后跟 3 个字符串,再后跟一个 int 和一个字符串。还有其他方法,我会回到这些。

一个非常基本的演示:

#include <stdio.h>

int main(void) {
    char * inputdata = "4273 Багров Д. С. 5454 знззз";
    // variables to receive the scanned data
    int firstint, secondint;
    char firststring[32];
    char secondstring[32];
    char thirdstring[32];
    char fourthstring[32];
    // important, you should check whether the number of converted elements 
    // matches what you expect:
    int scannedelements;

    // let's scan the input
    scannedelements = sscanf (inputdata,"%d %s %s %s %d %s",&firstint, &firststring, secondstring, 
                thirdstring,&secondint,fourthstring);
    // and show what we found.  Notice the similarity between scanf and printf
    // but also note the subtle differences!!!
    printf("We scanned %d %s %s %s %d %s\n",firstint, firststring, secondstring, 
                thirdstring,secondint,fourthstring);
    printf("That's a total of %d elements %d\n",scannedelements);
    return 0;
}

输出:

We scanned 4273 Багров Д. С. 5454 знззз 
That's a total of 6 elements

请注意,我将您命名为 exam 的字段扫描为一个整数,您可以通过 digit = data % 10; 的循环轻松地从中提取数字;数据 = 数据/10;

现在,第一组字符串被分成 3 个不同的输出这一事实可能很烦人。根据输出数据,我们可以指示 sscanf 读取直到遇到数字:

#include <stdio.h>

int main(void) {
    char * inputdata = "4273 Багров Д. С. 5454 знззз";
    // variables to receive the scanned data
    int firstint, secondint;
    char firststring[32];
    char secondstring[32];
    char thirdstring[32];
    char fourthstring[32];
    // important, you should check whether the number of converted elements 
    // matches what you expect:
    int scannedelements;

    // Alternatively, let's scan the group of 3 strings into 1 variable
    scannedelements = sscanf (inputdata,"%d %[^0-9] %d %s",&firstint, firststring, &secondint,fourthstring);
    // and show what we found.
    printf("We scanned %d %s %d %s\n",firstint, firststring,secondint,fourthstring);
    printf("That's a total of %d elements %d\n",scannedelements);
    return 0;
}

哪些输出:

We scanned 4273 Багров Д. С. 5454 знззз 
That's a total of 4 elements -1079150400 

注意 Багров Д 中的尾随空格。 С.,这可能是也可能不是问题,但很容易删除。

为方便起见,此代码可在 ideone 上获得:http://ideone.com/4gFlxf#sthash.KQfhcYxr.dpuf

这个例子只是简单地介绍了 scanf 的可能性,我鼓励您探索它的 manpage发现更多可能性。

--

关于如何计算平均分:

#include <stdio.h>

int main(void) {
    int inputdata = 24680;

    int average = 0;
    int number_digits = 0;
    int digit = 0;
    int digits = 0;

    while (inputdata > 0) {
        digit = inputdata % 10; // modulo by 10 is the last digit
        average += digit;
        digits++;
        inputdata = inputdata / 10; // integer division by 10 = remove last digit
    }

    if (digits > 0) { // to avoid dividing by zero is some edge case
        printf ("The average over %d scores is %.1f\n", digits, (double) average / digits);
    } else {
        printf ("As the input was 0, the average is 0");
    }

    return 0;
}

关于c - 数据结构中灵活的可变长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27458642/

相关文章:

c++ - 如何使快速排序算法中已排序数组的交换次数为零?

c - 是什么导致此代码中的段错误?

c - 用户输入哨兵值后如何终止循环?

c - 这是一个使用堆栈检查 C 中括号平衡的程序,但它没有按预期工作

java - 哪种数据结构占用更多内存?

c - 初始化结构中的指针数组时是否需要花括号?

python - 使用 Python 对 AD dnsRecord 值进行编码/解码

c - 使用 OpenMP : Parallel reduction calculation is invalid 时出错

c++ - C 中存在大量空变量,总大小超过内存

javascript - JavaScript 多项选择题的最佳数据结构