scanf_s 传输数组
时间: 2023-10-19 18:06:36 浏览: 133
使用scanf_s函数传输数组时,需要指定数组的大小。scanf_s的第一个参数是一个格式化字符串,指定了输入的数据类型和数据的大小。然后,需要在scanf_s函数的后面添加参数,将数组的大小作为额外的参数传递给scanf_s函数。这样,scanf_s函数就会根据指定的数组大小来接收输入的数据,并确保不会超出数组的范围。
相关问题
#include<iostream> #include<stdio.h> using namespace std; const int MAX = 20000;//最大输入文本长度为10,000 unsigned char In[MAX + 1]; //输入文本的字节存储形式 unsigned int Out[MAX / 2 + 1]; //输出编码,以4个字节存储 int len=0; //文本数据的长度 int len_of_str = 0; //字节数组的长度 //计算文本数据的长度并保证其不大于10,000 int lenth(unsigned char* a) { int cnt = 0; while (*a != NULL) { cnt++; a++; if (cnt >= MAX) break; } return cnt/2; } //查找与传入字或标点符号相同的字(往后索引,避免重复) int find_same(unsigned char* a,unsigned char b,unsigned char c,int b_i,int len_a) { for (int i = b_i+2; i < len_a; i++) { if (b == a[i]&&c==a[i+1]) return i/2; } return -1; } //数组a为输入,b为编码后的数组 void code(unsigned char* a, unsigned int* b,int len_a,int len_b) { for (int i = 0; i < len_b; i ++) { b[i] = i; } for (int i = 0; i < len_a; i += 2) { int j = find_same(a, a[i], a[i + 1], i, len_a); if (j == -1||b[j] == b[i]) { continue; } b[j] = b[i/2]; } } int main() { int i = 0; //读取不定长度的文本 while(scanf_s("%c", &In[i], unsigned int(sizeof(In[i])))) { if (In[i] == '\n') break; i++; } len = lenth(In); len_of_str = len * 2 + 1; code(In, Out, len_of_str, len); for (int i = 0; i < len; i++) cout << Out[i] << " "; cout <<endl<< "传输数据的大小为:"<<len << endl; system("pause"); return 0; } 优化这段代码
1. 将使用的头文件放在代码文件的最开始,避免出现一些不必要的问题
2. 将常量MAX定义为20000,但是输入的文本数据的长度最大为10000,这里可以将MAX定义为10001,以便进行优化。
3. 由于In数组和Out数组的长度都是定值,可以直接用定义数组时的常量定义数组长度。
4. 可以将len_of_str的计算移到lenth函数中,避免重复计算。
5. 在函数中使用常量引用替代非常量引用,可以提高效率。
6. 在使用scanf_s时,第二个参数中不应该使用sizeof(In[i]),应该使用sizeof(In[0]),这里可以使用%u代替%c,提高效率。
7. 将数据类型无关的常量定义为const,可以提高代码的可读性。
8. 将代码块内的变量定义放在代码块的开头,避免出现一些不必要的问题。
综上所述,优化后的代码如下:
以下代码什么意思:#include<iostream> #include<stdio.h> using namespace std; const int MAX = 20000;//最大输入文本长度为10,000 unsigned char In[MAX + 1]; //输入文本的字节存储形式 unsigned int Out[MAX / 2 + 1]; //输出编码,以4个字节存储 int len = 0; //文本数据的长度 int len_of_str = 0; //字节数组的长度 //计算文本数据的长度并保证其不大于10,000 int lenth(unsigned char* a) { int cnt = 0; while (*a != NULL) { cnt++; a++; if (cnt >= MAX) break; } return cnt / 2; } //查找与传入字或标点符号相同的字(往后索引,避免重复) int find_same(unsigned char* a, unsigned char b, unsigned char c, int b_i, int len_a) { for (int i = b_i + 2; i < len_a; i++) { if (b == a[i] && c == a[i + 1]) return i / 2; } return -1; } //数组a为输入,b为编码后的数组 void code(unsigned char* a, unsigned int* b, int len_a, int len_b) { for (int i = 0; i < len_b; i++) { b[i] = i; } for (int i = 0; i < len_a; i += 2) { int j = find_same(a, a[i], a[i + 1], i, len_a); if (j == -1 || b[j] == b[i]) { continue; } b[j] = b[i / 2]; } } int main() { int i = 0; //读取不定长度的文本 while (scanf_s("%c", &In[i], unsigned int(sizeof(In[i])))) { if (In[i] == '\n') break; i++; } len = lenth(In); len_of_str = len * 2 + 1; code(In, Out, len_of_str, len); for (int i = 0; i < len; i++) cout << Out[i] << " "; cout << endl << "传输数据的大小为:" << len << endl; system("pause"); return 0; }
这段代码实现了一种简单的文本压缩算法,主要步骤如下:
1. 定义了一个最大输入文本长度为20000的字节数组In,以及一个最大长度为10000的无符号整数数组Out,用于存储编码后的文本数据。
2. 通过lenth函数计算输入文本的长度,保证其不大于10000。
3. 通过code函数对输入的文本进行编码。具体地,该函数首先将输出数组初始化为0到len的序列,然后扫描输入数组中每个相邻的2个字节,寻找与其相同的字节组合,并将其编码为相同的整数值。如果找到了相同的字节组合,则将对应的输出数组元素赋值为其前面的字节组合对应的整数值,否则不做任何处理。
4. 在主函数中,通过scanf_s从标准输入中读取不定长度的文本,将其存储在In数组中,并通过code函数对其进行编码。最后,输出编码后的整数序列以及传输数据的大小。
需要注意的是,该算法仅适用于包含较多相同字节组合的文本,对于随机性较强的文本效果不佳。同时,代码中也存在一些可能会导致程序崩溃的漏洞,如输入文本长度超过最大值等。
阅读全文