BuctOJ 2109 : 程序改错 - memory函数
时间限制: 1 Sec 内存限制: 128 MB
提交: 296 解决: 65
[提交][状态][论坛]
题目来源:http://coder.buct.edu.cn:8088/JudgeOnline/problem.php?id=2109
题目描述
题目:根据一系列指令操作一段内存。指令有两种,set和copy。set的格式是set <from> <size> <value>:将这段内存中from开始size长度赋值为valuecopy的格式是copy <from> <size> <to>:将from开始的内存赋值到to的位置,长度为size以byte为单位。其中from, to, size 都是非负整数,value在byte范围内。内存初始值应为0
输入:多组数据,每组数据包括整数m、n,m为内存的长度,以byte为单位,n为指令的个数,其后n行包括n条指令,2<=m<=20, 1<=n<=10。输入数据保证不越界。
输出:每组数据一行,用16进制输出最后的内存值,16进制中的ABCDEF用大写字母
请将代码修正后提交:
#include <stdio.h>
#include <string.h>
int main() {
int m, n;
char buf[20], cmd[5];
int i;
int from, size, to_value;
while (scanf("%d%d", &m, &n) != EOF) {
memset(buf, m, 0);
for (i = 0; i < n; i++) {
scanf("%s%d%d%d", cmd, &from, &size, &to_value);
if (cmd[0] == 's') {
memset(buf + from, size, to_value);
} else {
memcpy(buf + to_value, buf + from, size);
}
}
for (i = 0; i < m; i++) {
printf("%02X", buf[i]);
}
printf("\n");
}
return 0;
}
输入
多组数据,每组数据包括整数m、n,m为内存的长度,以byte为单位,
n为指令的个数,其后n行包括n条指令,2<=m<=20, 1<=n<=10。输入数据保证不越界。
输出
每组数据一行,用16进制输出最后的内存值,16进制中的ABCDEF用大写字母
样例输入
5 1set 1 3 32
样例输出
0020202000
memmory函数用法:
memcpy
语法:
|
功能:函数从from中复制count 个字符到to中,并返回to指针。 如果to 和 from 重叠,则函数行为不确定。
memmove
语法:
|
功能: 与mencpy相同,不同的是当to 和 from 重叠,函数正常仍能工作。
memset
语法:
|
功能: 函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。 memset() 可以应用在将一段内存初始化为某个值。例如:
memset( the_array, '\0', sizeof(the_array) );
这是将一个数组的所以分量设置成零的很便捷的方法。
#include <stdio.h>
#include <string.h>
int main() {
int m, n;
char buf[20], cmd[5];
int from, size, to_value;
int i;
while (scanf("%d%d", &m, &n) != EOF)
{
memset(buf, 0, m*sizeof(int));//修改前为memset(buf, m, 0);
for (i = 0; i < n; i++)
{
scanf("%s%d%d%d", cmd, &from, &size, &to_value);
if (cmd[0]=='s'&&cmd[1]=='e'&&cmd[2]=='t')
{
// memset(buf + from, size, to_value);
memset(buf + from, to_value, size);
}
else if(cmd[0]=='c'&&cmd[1]=='o'&&cmd[2]=='p'&&cmd[3]=='y')
{
memmove(buf + to_value, buf + from, size);
//memcpy(buf + to_value, buf + from, size);
}
}
for (i = 0; i < m; i++) {
printf("%02X", buf[i]);
}
printf("\n");
}
return 0;
}
#include <string.h>
int main() {
int m, n;
char buf[20], cmd[5];
int from, size, to_value;
int i;
while (scanf("%d%d", &m, &n) != EOF)
{
memset(buf, 0, m*sizeof(int));//修改前为memset(buf, m, 0);
for (i = 0; i < n; i++)
{
scanf("%s%d%d%d", cmd, &from, &size, &to_value);
if (cmd[0]=='s'&&cmd[1]=='e'&&cmd[2]=='t')
{
// memset(buf + from, size, to_value);
memset(buf + from, to_value, size);
}
else if(cmd[0]=='c'&&cmd[1]=='o'&&cmd[2]=='p'&&cmd[3]=='y')
{
memmove(buf + to_value, buf + from, size);
//memcpy(buf + to_value, buf + from, size);
}
}
for (i = 0; i < m; i++) {
printf("%02X", buf[i]);
}
printf("\n");
}
return 0;
}