- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个模拟 n 路关联缓存映射的项目。然而,当尝试在后续方程中使用 address[i] 数组时,就会出现问题。我想我不明白为什么不保留数组。任何帮助将非常感激。我不是最擅长 C 编码的。现在的问题是从文件中读取并将这些值扫描到数组中。其他一切我相信我都能弄清楚。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/*global variables */
int mainSize, cacheSize, blockSize, cmSet, cnumBlocks, mnumBlocks,address[50],mmBlkNum[50], mappedCMset[50],hit_miss[50],address[50];
char mode[50];
int totMemRefs=0;
int main(void)
{
/*Variables */
int i;
char replacePolicy;
char filename[50];
char *result = NULL;
char line[50];
FILE *fp;
fp = fopen(filename, "r");
/*Gathers input from user */
printf("Enter the main memory size between between 4 and 32K bytes: ");
scanf("%d",&mainSize);
if (mainSize < 4 || mainSize > 32768)
{
printf("Invalid main memory size.");
//errorCheck()
}
printf("Enter the size of the cache between 2 and 32K bytes: ");
scanf("%d", &cacheSize);
if (cacheSize < 2 || cacheSize > 32768)
{
printf("Invalid cache memory size.");
//errorCheck()
}
printf("Enter the size of the block/line between 2 and 32K bytes: ");
scanf("%d",&blockSize);
if (blockSize < 2 || blockSize > 32768)
{
printf("Invalid block/line size.");
//errorCheck
}
printf("Enter the degree of set-associativity: ");
scanf("%d", &cmSet);
cnumBlocks = cacheSize/blockSize;
printf("Number of blocks in cache = %d\n", cnumBlocks);
mnumBlocks = mainSize/blockSize;
printf("Number of blocks in main memory = %d\n", mnumBlocks);
printf("Enter replacement policy (L = LRU, F = FIFO): ");
scanf("%s", &replacePolicy);
printf("Enter the name of the file containing the list of memory referenced: ");
scanf("%s", filename);
/* checks if filename is valid/exits */
if ((fp = fopen(filename, "r")) == NULL)
{
printf("Invalid input.");
//errorCheck();
}
/* gets total number of mem references from first line of file and stores in variable totMemRefs*/
fgets(line,sizeof(line),fp);
result = strtok(line,"\n");
totMemRefs = atoi(result);
printf("Total Mem Refs = %d\n", totMemRefs);
/*skips second line of white space */
fgets(line, sizeof(line),fp);
i=0;
//reads each line of file and tokenizes into mode and address
while (fgets(line, sizeof(line), fp)!=NULL)
{
if (sscanf(line,"%s %d",&mode[i],&address[i]) == 2)
{
printf("Mode: %c Address: %d\n",mode[i],address[i]);
i++;
}
}//end of parsing while loop
fclose(fp); //close file after reading
for (i=0; i<totMemRefs; i++)
{
/* calculates the corresponding block number of the address */
mmBlkNum[i]=address[i]/blockSize;
/* calculates the corresponding cache mem set that mm block is in */
mappedCMset[i]=mmBlkNum[i]%cnumBlocks;
printf("Mode = %c Address = %d MM Block Num = %d Cm Set = %d\n", mode[i],address[i],mmBlkNum[i],mappedCMset[i]);
}
}//end of main
这是 example_test_data.txt 的内容:
6
R 0
R 1
R 4
R 36
R 0
R 4
以下是主存储器和高速缓冲存储器的特性:
main mem size = 128 bytes
cache mem size = 32 bytes
block size = 4 bytes
set associativity = 2
filename = example_test_data.txt
这是 while 循环中数组的输出:
Mode: R Address: 0
Mode: R Address: 1
Mode: R Address: 4
Mode: R Address: 36
Mode: R Address: 0
Mode: R Address: 4
这是解析后数组的输出 - 在以下 for 循环中:
Mode = R Address = 4 MM Block Num = 1 Cm Set = 1
Mode = Address = 0 MM Block Num = 0 Cm Set = 0
Mode = Address = 0 MM Block Num = 0 Cm Set = 0
Mode = Address = 0 MM Block Num = 0 Cm Set = 0
Mode = Address = 0 MM Block Num = 0 Cm Set = 0
Mode = Address = 0 MM Block Num = 0 Cm Set = 0
如您所见,模式和地址数组的第二次迭代与文件 while 循环中的不同。我很困惑为什么会出现这种情况。我尝试尽可能地进行描述。我也不知道为什么格式没有显示。抱歉,如果这会使阅读变得更加困难。再次强调,任何帮助或插入正确的方向将不胜感激!
编辑:输出应该是:
Mode = R Address = 0 MM Blk Num = 0 CM Set = 0
Mode = R Address = 1 MM Blk Num = 0 CM Set = 0
Mode = R Address = 4 MM Blk Num = 1 CM Set = 1
Mode = R Address = 36 MM Blk Num = 9 CM Set = 1
Mode = R Address = 0 MM Blk Num = 0 CM Set = 0
Mode = R Address = 4 MM Blk Num = 1 CM Set = 1
我知道获得正确值所需的方程式。我知道如何手工处理这些,没问题。因此,知道结果应该是什么并不是问题。以前,我使用过 fscanf 和 strtok,但它们都没有产生预期的结果。基本上,当我在扫描时在 while 循环中打印它时,它可以工作,但是一旦我尝试计算 mmBlkNum 和mappedCMset,数组中的值就不同了。
代码已更新!
最佳答案
我看到的第一个错误:
scanf("%s", &filename);
替换为正确的参数:
scanf("%s", filename);
请使用-Wall
进行编译,这样编译器就会说出这些内容。与-Werror
结合使用。还推荐-Wextra
。
我的编译器与您的程序的输出:
stackoverflow.c: In function 'main':
stackoverflow.c:246:11: error: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[50]' [-Werror=format=]
scanf("%s", &filename);
^
cc1.exe: all warnings being treated as errors
我看到的第二个错误:您将所有读取的内容放在 while
循环中的同一索引 i = 0
处。正确使用 for
或使用 while
:
i = 0;
while (fgets(line, sizeof(line), fp)!=NULL && i < totMemRefs)
{
if (sscanf(line,"%s %d",&mode[i],&address[i]) == 2)
{
printf("Mode: %c Address: %d\n",mode[i],address[i]);
i++;
}
}//end of parsing while loop
if (i < totMemRefs)
{
fprintf(stderr, "Missing inputs.\n");
return 1;
}
我还添加了验证输入不超出用户所说的将提供的输入数量,并且验证用户提供所有行。考虑在程序开头添加类似的内容:
#define MAX_INPUT_LINES 50
并使用MAX_INPUT_LINES
而不是50
。
关于c - 使用 sscanf 解析不会保留数组以供后续使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36880436/
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我在程序中遇到了以下行。通过阅读手册,我知道 sscanf 从 argv[2] 指向的任何地方复制,但我不确定为什么格式被指定为 %d,同时指定为 %c (我见过其他双引号中包含更多格式说明符的示例)
我可以使用字符指针 (char *) 作为 sscanf() 函数中的输出字符串吗?考虑到我不知道字符串的长度(这就是我使用指针的原因)。 char *name; sscanf(data, "Name
我有一个表单的输入字符串 char *s = "one.two three" 我想把它分成 3 个字符串变量。我在做 sscanf(s, "%s.%s %s", one, two, three); 但
我一直在尝试让 sscanf 使用字符类识别一种相当简单的格式。我注意到,当我为 sscanf 提供 char* 以匹配字符类时,它也会覆盖前一个字节,就好像它需要一个指向 2 个字节的指针一样。 我
我正在将 MAC 地址的字符串表示形式转换为 UINT8 的数组s 定义为 unsigned char 。我很好奇为什么sscanf()当我读入 UINT8 数组时,将读取全 0当我读入常规 32 位
我有一个包含空格和标签的字符串,例如: sp|P02671|FIBA_HUMAN Fibrinogen alpha chain OS=Homo sapiens GN=FGA PE=1 SV=2 我只想
我正在尝试在 C 中使用 sscanf 函数,但它不读取格式是必需的,我已经阅读了该函数的文档并遵循了示例,但它对我来说仍然效果不佳,因此我想要一些建议.. int main() { long i
我需要在c中解析一个格式为“foo=%d”的字符串,我需要检查格式是否正确并读取int值。 我的初始代码是: int foo_set = 0; int foo; if (sscanf(text, "f
在下面的代码中,我想读取十六进制字符串 'a' 中的前 2 个字符,使用 sscanf 将它们转换为相应的字节值并将结果放入 'b'。不应对“a”执行任何修改。 #include #include
我试图找出我应该给 sscanf 的模式。 我有一个字符串 abcde(1GB)。我想提取 1 和 GB。我在用 char list[]= "abcde(1GB)"; int memo
我应该得到一个可以是以下任何格式的输入行: 单词 1 和单词 2 之间必须有空格。 单词 2 和单词 3 之间必须有逗号。 单词 2 和单词 3 之间不一定要有空格,但可以有任意数量的空格。 如何分离
最近发现的对 GTA 冗长加载时间 (1) 的解释表明 sscanf() 的许多实现调用 strlen()在他们的输入字符串上为与其他扫描函数( scanf() , fscanf() ...)共享的内
我需要将字符串分成两部分,字符串的第一列是第一部分,字符串的其余部分是第二部分。第一部分需要存储在 first_str 中,第二部分需要存储在 rest_str 中。 我正在使用 sscanf 来实现
我需要从char数组中提取数字,它以hh:mm的格式存储值(示例20:20) 我尝试使用sscanf函数将hh提取为小时变量,将mm提取为分钟变量。 直到时间类似于0number:0number或如果
所以我想知道 sscanf 在遇到像这样的行时是如何工作的: sscanf(input_string, "%s %s %s", cmd1, cmd2, cmd3); 但是假设 input_string
我在以下代码中遇到 sscanf() 问题: void num_check(const char*ps){ char *ps1=NULL; int number=0; unsigned sum_num
谁能解释一下为什么在下面的代码中没有拆分字符串 #include int main(void) { char name[] = "first:last"; char first[20
我正在尝试解析一个 URL,并编写了这段代码: #include int main() { char host[100]; char port[100]; char path
我正在为我正在制作的程序使用 AT 命令,但在使用 sscanf() 函数解析它们时遇到问题。 例如,如果我执行此命令: "AT\r\r\nOK\r\n" 我想:* 在第一次调用时,仅获取“AT”部分
我是一名优秀的程序员,十分优秀!