修改下列代码#include <iostream> #include <cstring> using namespace std; #define SONG_SIZE 10 #define SONG_NAME_SIZE 20 int main() { /********* Begin *********/ char*p[10]; for(int i=0;i<10;i++){ cin>>p[i]; } for(int i=0;i<10;i++){ for(int l=0;l<10;l++){ if(strcmp(p[i],p[l])==1){ char *u=p[i]; *p[i]=*p[l]; *p[l]=*u; } } } for(int i=0;i<10;i++){ cout<<p[i]; } /********* End *********/ return 0; }
时间: 2023-07-23 17:31:19 浏览: 80
这段代码的作用是输入 10 首歌曲名称,按照字典序排序后输出。但是存在一些问题,如下所示:
1. 声明了 char* p[10],但是没有为每个指针分配内存空间,导致在输入歌曲名称时会发生段错误。
2. strcmp 的判断条件应该是 strcmp(p[i], p[l]) < 0,而不是 strcmp(p[i], p[l]) == 1。
3. 在交换两个指针时,应该是交换它们指向的字符串地址,而不是交换指针本身的值。
修改后的代码如下:
```
#include <iostream>
#include <cstring>
using namespace std;
#define SONG_SIZE 10
#define SONG_NAME_SIZE 20
int main() {
char songs[SONG_SIZE][SONG_NAME_SIZE]; // 修改为二维字符数组
char* p[SONG_SIZE];
for (int i = 0; i < SONG_SIZE; i++) {
p[i] = songs[i]; // 每个指针指向一个字符串
cin >> p[i];
}
for (int i = 0; i < SONG_SIZE; i++) {
for (int j = i + 1; j < SONG_SIZE; j++) {
if (strcmp(p[i], p[j]) > 0) { // 修正 strcmp 的判断条件
char* temp = p[i]; // 交换指向的字符串地址
p[i] = p[j];
p[j] = temp;
}
}
}
for (int i = 0; i < SONG_SIZE; i++) {
cout << p[i] << endl;
}
return 0;
}
```
注意,修改后的代码中使用了二维字符数组来存储每个歌曲名称,每个指针指向一个字符串,这样可以避免未分配内存空间的问题。
阅读全文