C 删除重复字符串
我需要删除重复字符串的帮助。我的代码几乎就在那里,它输出唯一的字符串,然后崩溃,请自行查看。我怎样才能阻止这种事情发生C 删除重复字符串,c,C,我需要删除重复字符串的帮助。我的代码几乎就在那里,它输出唯一的字符串,然后崩溃,请自行查看。我怎样才能阻止这种事情发生 #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++) {
#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);
}
#包括
#包括
内部主(空)
{
字符数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j,k;
INTA=4;
对于(i=0;i
如果使用调试器逐步调试程序,您会发现以下问题:
strcpy(array[k],array[k+1]);
当k==3
您试图访问array
范围之外的元素,以获取strcpy
的第二个参数:
array[k+1]
如果使用调试器逐步执行程序,您会发现以下问题:
strcpy(array[k],array[k+1]);
当k==3
您试图访问array
范围之外的元素,以获取strcpy
的第二个参数:
array[k+1]
如果使用调试器逐步执行程序,您会发现以下问题:
strcpy(array[k],array[k+1]);
当k==3
您试图访问array
范围之外的元素,以获取strcpy
的第二个参数:
array[k+1]
如果使用调试器逐步执行程序,您会发现以下问题:
strcpy(array[k],array[k+1]);
当k==3
您试图访问array
范围之外的元素,以获取strcpy
的第二个参数:
array[k+1]
最好使用strncmp而不是strcmp。 您不必遍历字符串的每个字符,因为
strncmp
将字符串与其结尾(以null结尾的字符串)进行比较。从strncmp
的文档(unix系统上的man-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]);
}
}
char数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j;
INTA=4;
for(int i=0;i
最好使用strncmp而不是strcmp。
您不必遍历字符串的每个字符,因为strncmp
将字符串与其结尾(以null结尾的字符串)进行比较。从strncmp
的文档(unix系统上的man-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]);
}
}
char数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j;
INTA=4;
for(int i=0;i
最好使用strncmp而不是strcmp。
您不必遍历字符串的每个字符,因为strncmp
将字符串与其结尾(以null结尾的字符串)进行比较。从strncmp
的文档(unix系统上的man-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]);
}
}
char数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j;
INTA=4;
for(int i=0;i
最好使用strncmp而不是strcmp。
您不必遍历字符串的每个字符,因为strncmp
将字符串与其结尾(以null结尾的字符串)进行比较。从strncmp
的文档(unix系统上的man-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]);
}
}
char数组[4][4]={“cat”、“mat”、“sat”、“mat”};
int i,j;
INTA=4;
for(int i=0;i
你的方法不好。当您找到一个匹配的字符串时,您将在新位置复制数组的所有尾部
这里有一个更简单、更清晰的方法
#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;
}
只需复制粘贴并进行调查。:您的方法不好。当您找到一个匹配的字符串时,您将在新位置复制数组的所有尾部 这里有一个更简单、更清晰的方法
#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;
}
只需复制粘贴并进行调查。:您的方法不好。当您找到一个匹配的字符串时,您将在新位置复制数组的所有尾部 这里有一个更简单、更清晰的方法
#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;
}
只需复制粘贴并进行调查。:您的方法不好。当您找到一个匹配的字符串时,您将在新位置复制数组的所有尾部 这里有一个更简单、更清晰的方法