清空数组可以用memset函数吗?如果可以的话怎么用啊?麻烦用C++讲一下,谢谢

 我来答
fufknp
2011-03-04 · TA获得超过397个赞
知道小有建树答主
回答量:463
采纳率:0%
帮助的人:0
展开全部
是一个局部数组,局部变量是保存在堆栈里面的,空间是在运行时分配的,程序执行到这里时,根据 n 值的大小,调整堆栈指针 esp 来分配空间,子程序返回的时候,再让这些空间出栈,这是一个完全动态的过程,所以 n 可以是一个变量。除非 lib 是个全局数组,大小才需要在编译期间确定好。

但是堆栈的空间毕竟是不大的,因此这种做法并不推崇,如果遇到 n 很大的情况,lib[n][19] 就是一个很大的数组,保存在堆栈里面极有可能造成栈溢出,提交到 OJ 上就会返回莫名其妙的 runtime error,所以一般来说数组还是建议都定义成全局的。

这个题目,首先楼主你的算法是错误的,题目说了:加密算法是保持单词首尾两个字母不变,中间的字母顺序打乱,但是在你的判断语句中

if(length2[m]==length1[j])
if(word[0]==lib[j][0])
if(word[(length2[m]-1)]==lib[j][(length2[m]-1)])
cout<<lib[j];

只判断了
1. 长度相等
2. 首字母一样
3. 尾字母一样

而并没有考虑中间的字母,也就是说,对于你这个算法,完全有可能把比如 asker 当成是对 after 的加密,但其实两者是不同的单词,因为 ske 和 fte 里的字母再怎么改变顺序也不可能相同。所以除了上面3个条件的判断之外,你还应该考虑单词中间的字母是否匹配,常规的做法是将两者中间的字母都拿出来,构成两个列表,然后分别排序,再一一比较。

代码方面,还有一处比较严重的错误在这一句:

memset(word,0,21);

因为根据你的定义,word这个数组事实上只有19个字节,但是你 memset 却清空了连续 21 个字节的内容,结果就是造成 word 数组以外的变量也被清掉了,这里应该改成

memset(word,0,sizeof(word)); // 应该是用 sizeof 来计算数组大小

而且 word 这个数组定义成 19 字节也是不对的,因为题目中说了最长的单词最长可能有 20 个字符,加上最末端的 '\0',你应该给 word 分配 21 个字节的空间,才能保证读入的单词能够存下。

另外,逻辑上讲,其实你程序里面这个 word 数组是根本没有必要清空的。

最后帮楼主修改了一下程序:

#include<cstring>
#include<iostream>
#include<string>
using namespace std;

// 补充一个函数,检查从 s1 和 s2 开始,长度为 len 的两个字符串,
// 其中一个是否为另一个打乱字母顺序的结果。
bool check(char *s1, char *s2, int len) {
int cnt[26] = ;
for (int i = 0; i < len; i++) {
cnt[s1[i]-'a']++; cnt[s2[i]-'a']--;
}
for (int i = 0; i < 26; i++)
if (cnt[i]) return 0;
return 1;
}

int main(){
int n;

cin>>n;
char lib[n][21]; // 单词最长为20,数组大小改为21
char word[21];
char no;
int length1[n];
int length2[501];

for(int i=0;i<n;i++){
cin>>lib[i];
length1[i]=strlen(lib[i]);
}

for(int m=0;m<501;m++){
cin>>word;
no=cin.get();
length2[m]=strlen(word);
if(length2[m]>2){
for(int j=0;j<n;j++){
if(length2[m]==length1[j])
if(word[0]==lib[j][0])
if(word[(length2[m]-1)]==lib[j][(length2[m]-1)])
if (check(word+1, lib[j]+1, length2[m]-2)) // 这里补充检查单词中间的字母
cout<<lib[j];
}
}
else
cout<<word;
if (no=='\n')
cout<<endl;
else if (no != EOF) // 避免输入结束后继续输出多余的空格(否则会PE)
cout<<" ";
memset(word,0,sizeof(word)); // 改成 sizeof(word)
}

return 0;
}

楼主的算法时间复杂度是 O(m*n*L) 的,并不是很优,可以考虑通过哈希表等方法降低到接近 O(m+n),不过对于这题的数据规模,前面的算法已经可以通过了。
葛允Se
2011-03-03 · TA获得超过495个赞
知道小有建树答主
回答量:223
采纳率:0%
帮助的人:91万
展开全部
char str[10];
memset(str, 0, sizeof(str));
或者
memset(str, 0, sizeof(char)*10);

这是C的标准函数,C++能用只不过是能兼容C而已.
所以不理解LZ后面那句话
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式