我需要帮助删除重复的字符串。我的代码几乎就在那里,它输出唯一的字符串然后崩溃,自己看看。我怎样才能阻止这种情况发生?
#include <stdio.h>
#include <string.h>
int main(void)
{
char array[4][4]={"cat","mat","sat","mat"};
int i, j, k;
int a=4;
for (i = 0;i < a; i++)
{
for (j = i + 1; j < 4;)
{
if (strcmp(array[j],array[i])==0)
{
for (k = j; k < a; k++)
{
strcpy(array[k],array[k+1]);
}
a--;
}
else
j++;
}
}
for (i = 0; i < a; i++)
{
printf("%s", array[i]);
}
return (0);
}
答案 0 :(得分:2)
如果您使用调试器逐步执行程序,则会发现以下是您的问题:
strcpy(array[k],array[k+1]);
当您k == 3
尝试访问array
范围之外的元素时strcpy
的第二个参数:
array[k+1]
答案 1 :(得分:1)
你的方法并不好。找到匹配的字符串时,将数组的所有尾部复制到新位置。
这是一种更简单明了的方法
#include <stdio.h>
#include <string.h>
#define N 4
int main(void)
{
char s[N][N] = { "cat", "mat", "sat", "mat" };
int i, j;
j = 0; /* current osition where a unique string will be placed */
for ( i = 0; i < N; i++ )
{
int k = 0;
while ( k < j && strcmp( s[k], s[i] ) != 0 ) k++;
if ( k == j )
{
if ( j != i ) strcpy( s[j], s[i] );
j++;
}
}
for ( i = 0; i < j; i++ ) printf( "%s ", s[i] );
puts( "" );
return 0;
}
输出
cat mat sat
只需复制粘贴并进行调查。:)
答案 2 :(得分:0)
最好使用strcmp的strncmp。
您不必遍历字符串的每个字符,因为strncmp
比较字符串tills它们的结尾(空终止字符串)。来自strncmp
的文档(unix系统上的man strncmp):
strncmp()函数比较不超过n个字符。因为strncmp()用于比较字符串而不是二进制数据,所以不会比较出现在'\ 0'字符后面的字符。
试试这段代码:
char array[4][4]={"cat","mat","sat","mat"};
int i, j;
int a = 4;
for (int i = 0; i < a; i++) {
bool unique = true;
for (int j = i + 1; j < a; j++) {
if (strncmp(array[i], array[j], a) == 0) {
unique = false;
break;
}
}
if (unique) {
printf("%s\n", array[i]);
}
}