【发布时间】:2017-07-07 19:08:04
【问题描述】:
我知道这个问题之前已经被问过很多次了,但是我是 C 数组的完全初学者,并且希望避免使用指针(如果可能的话)并使其尽可能简单。 我已将用户的输入用于 char 数组,并希望删除程序中所有重复的字符串值
#include<string.h>
#include<stdio.h>
int main(){
int N, i, j, k;
int flag=1;
scanf("%d", &N);
if(1<=N<=10^6){
char a[N][5];
for(i=0; i<N; i++){
scanf("%s", &a[i]);
}
for(i=0; i<N; i++){
for(j=i+1;j<N;){
if(strcmp(a[i],a[j])==0){
for(k=j+1; k<N; k++){
memcpy(a[k], a[k+1], 5);
}
N--;
}else{
j++;
}
}
}
for(i=0; i<N; i++){
printf("%s\n", a[i]);
}
}
return 0;
}
输入 3 和 {"abc", "abc", "as"} 只返回值 {"abc"}。 我想将数组设为 {"abc", "as"}。我不明白代码或逻辑的哪里出错了。
更新
我更改了下面提到的代码,但是对于更大的示例,它正在连接字符串
#include<string.h>
#include<stdio.h>
int main(){
int N, i, j, k;
scanf("%d", &N);
if(1 <= N && N <= 1000000){
char a[N][5];
for(i=0; i<N; i++){
scanf("%5s", a[i]);
}
for(i=0; i<N; i++){
for(j=i+1;j<N;){
if(strcmp(a[i],a[j])==0){
for(k=j+1; k<N; k++){
strcpy(a[k-1], a[k]);
}
N--;
}else{
j++;
}
}
}
printf("%d\n", N);
for(i=0; i<N; i++){
printf("%s\n", a[i]);
}
}
return 0;
}
【问题讨论】:
-
这个问题是针对 C 还是 C++ 的?它们不是同一种语言。请选择一个并删除另一个标签。
-
您最里面的循环正在访问
a[k+1]处的数组越界。可能会有更多错误,但这已经是未定义的行为。 -
顺便说一句,这实际上是 C 代码(C++ 有
std::string和std::vector等等,你应该在 C++ 中使用它们)。最好摆脱iostream(您不使用它)并将其作为C问题提出。 -- 哦,对这样的代码使用 C 编译器,而不是 C++ 编译器。 -
下一个错误:如果您的数组成员只有 5 个字节,为什么还要复制 6 个字节? (你可以只使用
strcpy()btw)——然后,scanf("%s", ...)总是是缓冲区溢出,不要使用它。如果您输入更多字符,它不会神奇地停止解析。 -
@FelixPalmen 我已经对缓冲区溢出进行了更改。但是输出仍然保持不变。我应该如何解决数组 out of bounds at a[k+1] 的问题?