冒泡在c中动态创建结构数组

在这里真的很新,很抱歉任何进一步的错误..我有一些新的学校项目(学习C),我必须使用套接字连接到服务器,而不是从服务器下载所有代码行。 在那之后,我需要对行进行排序,使它们按顺序排列,我得到的就是排序……好吧我已经下载了代码行,将它们保存在struct array中但是现在我的冒泡排序显示了一些错误给了我而我没有知道什么是问题.. thx任何帮助。

typedef struct DATA{ char* buf; }DATA; // this fucntion creates a socket. void sort_array(DATA *to_sort, int len){ int i, j; char tmp[1024] = ""; for (i = 0; i < len - 1; i++){ for (j = 0; j < len - i - 1; j++){ if (strcmp(to_sort[j].buf, to_sort[j + 1].buf) < 0){ strcpy(tmp, to_sort[j + 1].buf); strcpy(to_sort[j + 1].buf, to_sort[j].buf); strcpy(to_sort[j].buf, tmp); } } } } int main(){ WSADATA info; int error, s,j; int sendError, recvError; char buffer[1024] = "100",readbuf[1024] = ""; char recvbuf[1024] = ""; int numberLines, i, temp, convert; char converted_num[1024] = ""; char *sub; struct sockaddr_in ClientService; FILE *fp = fopen("stored_data.txt", "w"); FILE *ofp = fopen("final_result.txt", "w"); DATA *to_sort = NULL; error = WSAStartup(MAKEWORD(2, 0), &info); //check if error occurred while configuring. if (error != 0){ printf("WSAstartup failed with error: %d\n", error); exit(1); } s = socket_creation(fp); // configuration of the socket. ClientService.sin_family = AF_INET; ClientService.sin_addr.s_addr = inet_addr("54.209.143.42"); ClientService.sin_port = htons(6714); connection(s, ClientService, fp); // function connecting to the server. error = WSAStartup(MAKEWORD(2, 0), &info); // send '100' login command to server. strcpy(buffer, "100"); sendError = send_to_serv(buffer, s); // receiving respond from the server. recvError = recv_from_serv(s, &numberLines, fp,buffer); // send '400' get number lines command to server. strcpy(buffer, "400"); sendError = send_to_serv(buffer, s); // receiving respond from the server. recvError = recv_from_serv(s, &numberLines, fp,buffer); printf("\nNumber of Lines are: %d\n", numberLines); temp = numberLines; // number of all lines received. /* allocate mmoery for struct array to store the data from server */ to_sort = (DATA*)malloc(sizeof(DATA)* temp); // getting the lines from the server. for (i = 0; i nul"); return 0; } 

 void bsort(char **data, size_t size) { size_t i, j; char *tmp = NULL; for (i = 1; i < size; i++) { for (j = 1; j < size; j++) { if (strcmp(data[j-1], data[j]) > 0) { tmp = data[j-1]; data[j-1] = data[j]; data[j] = tmp; } } } } 

这段代码做了排序。 我查了)))需要更多时间。 意思是试试这段代码,如果不行,那就再往前走,再次检查错误。

 to_sort[j] = (char*) malloc(1024); memcpy(to_sort[j].buf, buffer, 1024); j++; 

我读取数据直到获得完全缓冲区。 每次数据传输时都不要尝试检查502。 得到回复后只有一次。 之后,您将响应流式传输直至结束。

 #define REPLY 1024 do { bytes_read = recv(sock, server_reply, REPLY, 0); if (bytes_read == SOCKET_ERROR) { perror("error recieving data"); exit(1); } if (bytes_read > 0) { to_sort[j] = (char*) malloc(1024); memcpy(to_sort[j].buf, server_reply, 1024); j++; } } while (bytes_read == REPLY); 

UPD

 void bsort(DATA *data, size_t size) { size_t i, j; DATA tmp; for (i = 1; i < size; i++) { for (j = 1; j < size; j++) { if (strcmp(data[j-1].buf, data[j].buf) > 0) { tmp = data[j-1]; data[j-1] = data[j]; data[j] = tmp; } } } } 

UPD2

 //1) Simpliest way //pointer to array DATA *s = NULL; //size of array size_t array_size = 50; //create array of DATA elements s = (DATA *) malloc(sizeof(DATA) * array_size); //now you have array of DATA. But each element contains uninitialized pointer //of type char //set each pointer to proper address on heap //each element now can handle string length 1023 //note here all strings have same size for (size_t i = 0; i < array_size; i++) { s[i].buf = (char*) malloc(1024); } 

并且免费

 for (size_t i = 0; i < array_size; i++) { free(s[i].buf); } free(s); 

排序

 DATA *s = NULL; size_t array_size = 5; size_t i; s = (DATA *) malloc(sizeof(DATA) * array_size); for (i = 0; i < array_size; i++) { s[i].buf = (char*) malloc(1024); } strcpy(s[0].buf, "AAAAA"); strcpy(s[1].buf, "CCCCC"); strcpy(s[2].buf, "XXXXX"); strcpy(s[3].buf, "AAAAA"); strcpy(s[4].buf, "BBBBB"); bsort(s, 5); for (i = 0; i < array_size; i++) { printf("%s\n", s[i]); } for (i = 0; i < array_size; i++) { free(s[i].buf); } free(s); 

UPD3以更复杂的方式分配内存,但速度要快得多

 DATA *s = NULL; size_t array_size = 5; size_t item_size = 1024; size_t i; s = (DATA *) malloc(sizeof(DATA) * array_size + array_size * item_size); s[0].buf = (char*) (s + array_size); for (size_t i = 0; i < array_size; i++) { s[i].buf = s[0].buf + i * item_size; } strcpy(s[0].buf, "AAAAA"); strcpy(s[1].buf, "CCCCC"); strcpy(s[2].buf, "XXXXX"); strcpy(s[3].buf, "AAAAA"); strcpy(s[4].buf, "BBBBB"); bsort(s, 5); for (i = 0; i < array_size; i++) { printf("%s\n", s[i]); } free(s);