/*删除指针数组中重复的字符串*/ #include<stdio.h> #include<string.h> int del_name(char **name,int n)//删除函数 { int i,j,k; for(i=0;i<n;i++) {for(j=j+1;j<n;) if(strcmp(name[i],name[j])==0)//比较两个字符串 {for(k=j;k<n;k++) name[k]=name[k+1];//字符串移位 name[k]=0; n--;//字符串个数-1 } else j++; } return n; } int main() { char *name[]={"tianjin","taiyuan","beijing","shanghai","tianjin","beijing"}; int n=sizeof(name)/sizeof(char*);//计算字符串的个数 printf("Before deleting:\n"); for(int k=0;k<n;k++) puts(name[k]); n=del_name(name,n);//调用删除函数 printf("After deleting:\n"); for(int k=0;k<n;k++) puts(name[k]); return 0; }为什么输出的有重复的beijing
时间: 2024-03-03 22:52:42 浏览: 13
在你的删除函数中,有一个错误,导致重复的字符串无法被正确删除。在第6行的循环语句中,变量j没有初始化,所以在第8行的比较语句中,j的值不确定,可能会比i小,导致重复的字符串没有被比较到。你可以将第6行的for循环语句改成以下形式,来解决这个问题:
```
for(i=0;i<n;i++)
{
for(j=i+1;j<n;)
{
if(strcmp(name[i],name[j])==0)
{
for(k=j;k<n;k++)
name[k]=name[k+1];
name[k]=0;
n--;
}
else
j++;
}
}
```
这样修改后,输出的结果就不会再有重复的字符串了。
相关问题
解释这三行#include <stdlib.h> #include <string.h> #include <stdio.h>
这三行代码是C语言中的预处理指令,用于引入标准库中的函数和定义。具体解释如下:
1. `#include <stdlib.h>`:引入stdlib.h头文件,该头文件包含了一些常用的函数,如内存分配、类型转换、随机数生成等函数。
2. `#include <string.h>`:引入string.h头文件,该头文件包含了一些字符串处理函数,如字符串复制、字符串比较、字符串连接等函数。
3. `#include <stdio.h>`:引入stdio.h头文件,该头文件包含了一些输入输出函数,如文件操作、标准输入输出等函数。
这些头文件中的函数可以在程序中直接调用,以实现相应的功能。例如,可以使用stdlib.h中的函数来进行内存分配和释放,使用string.h中的函数来处理字符串,使用stdio.h中的函数来进行文件操作和标准输入输出。
#include <unistd.h> #include <string.h> #include <stdio.h> #include <sys/stat.h> #include <fcntl.h>
`#include <unistd.h>`是一个C语言的头文件,它包含了一些与系统调用相关的函数和常量。其中一些常用的函数包括`fork()`、`exec()`和`pipe()`等。`<string.h>`是另一个C语言的头文件,它包含了一些与字符串操作相关的函数,例如`strcpy()`和`strlen()`等。`<stdio.h>`是标准输入输出的头文件,它包含了一些与输入输出相关的函数,例如`printf()`和`scanf()`等。`<sys/stat.h>`是一个系统状态的头文件,它包含了一些与文件状态相关的函数和常量,例如`stat()`和`chmod()`等。`<fcntl.h>`是文件控制的头文件,它包含了一些与文件操作相关的函数和常量,例如`open()`和`close()`等。
以下是一个简单的示例代码,演示了如何使用这些头文件中的函数:
```c
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
// 使用unistd.h中的函数
int pid = fork();
if (pid == 0) {
// 子进程
printf("This is child process.\n");
} else if (pid > 0) {
// 父进程
printf("This is parent process.\n");
} else {
// 出错
perror("fork");
return 1;
}
// 使用string.h中的函数
char str1[10] = "Hello";
char str2[10];
strcpy(str2, str1);
printf("Copied string: %s\n", str2);
// 使用stdio.h中的函数
int num;
printf("Enter a number: ");
scanf("%d", &num);
printf("You entered: %d\n", num);
// 使用sys/stat.h和fcntl.h中的函数
int fd = open("file.txt", O_RDONLY);
struct stat fileStat;
fstat(fd, &fileStat);
printf("File size: %ld bytes\n", fileStat.st_size);
close(fd);
return 0;
}
```
这段代码演示了如何使用`fork()`函数创建子进程,使用`strcpy()`函数复制字符串,使用`scanf()`函数读取用户输入的数字,以及使用`open()`函数打开文件并使用`fstat()`函数获取文件大小。