Hacker Rank字符串数组排序问题:strcpy引发输出异常
问题:Hacker Rank字符串数组排序题输出异常
我在完成Hacker Rank的《Sorting Array of Strings》题目时,遇到了输出不符合预期的问题:相同代码在本地GCC编译运行能得到正确结果,但提交到Hacker Rank平台后输出错误。
在void string_sort函数中,将交换逻辑替换为指针交换(如下代码)后,结果恢复正常;但使用原本的strcpy交换方式时就会出错。因此我推测自己对strcpy的特性理解有误或使用不当。
指针交换代码:
char *temp = arr[i4]; arr[i4] = arr[i4 + 1]; arr[i4 + 1] = temp;
注:main函数由Hacker Rank平台预设,无法修改,我仅实现了main函数之前的5个函数,分别是lexicographic_sort、lexicographic_sort_reverse、sort_by_number_of_distinct_characters、sort_by_length、string_sort。
完整代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int lexicographic_sort(const char* a, const char* b) { if(strcmp(a, b) < 0){ return 2; } else{ return 4; } } int lexicographic_sort_reverse(const char* a, const char* b) { if(strcmp(a, b) < 0){ return 4; } else{ return 2; } } int sort_by_number_of_distinct_characters(const char* a, const char* b) { int Arr[26]= {0}, counterA= 0, counterB= 0; for(int i1= 0; i1<strlen(a); i1++) { Arr[a[i1] - 'a']++; if(Arr[a[i1] - 'a'] == 1){ counterA++; } } for(int i1= 0; i1<26; i1++){ Arr[i1]= 0; } for(int i1= 0; i1<strlen(b); i1++){ Arr[b[i1] - 'a']++; if(Arr[b[i1] - 'a'] == 1){ counterB++; } } if(counterA < counterB){ return 2; } else if(counterA == counterB){ return lexicographic_sort(a, b); } else{ return 4; } } int sort_by_length(const char* a, const char* b) { if(strlen(a) < strlen(b)){ return 2; } else if(strlen(a) == strlen(b)){ return lexicographic_sort(a, b); } else{ return 4; } } void string_sort(char** arr,const int len,int (*cmp_func)(const char* a, const char* b)){ for(int i3= 0; i3 < (len-1); i3++){ for(int i4= 0; i4 < (len-1)-i3; i4++){ if(cmp_func(arr[i4], arr[i4+1]) == 4){ char temp[1024]= {0}; strcpy(temp, arr[i4]); strcpy(arr[i4], arr[i4+1]); strcpy(arr[i4+1], temp); } } } } int main() { int n; scanf("%d", &n); char** arr; arr = (char**)malloc(n * sizeof(char*)); for(int i = 0; i < n; i++){ *(arr + i) = malloc(1024 * sizeof(char)); scanf("%s", *(arr + i)); *(arr + i) = realloc(*(arr + i), strlen(*(arr + i)) + 1); } string_sort(arr, n, lexicographic_sort); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, lexicographic_sort_reverse); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, sort_by_length); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, sort_by_number_of_distinct_characters); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); }
内容的提问来源于stack exchange,提问作者Mohamed Ahmed
相关产品推荐
相关产品推荐

