编写一个程序,读取用户的一行,直到用户按下回车键('\n'(。存储一行中的所有单词转换为多维动态数组。然后将此数组传递给函数SortString((,该函数将对所有按单词长度排列的单词,即最长的单词将放在第一个索引处,然后第二长的单词放置在第二个索引,依此类推。最后将排序后的单词列表返回到main函数,其中所有单词将以每行一个单词的形式打印到屏幕上。假设该行包含所有唯一的文字。
我在这里写了一些代码,但我在如何对行中单词的长度进行排序并按降序打印时遇到了问题。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
main(){
char string[50];
int i, l;
char *ptr, *p;
printf("Enter the string: ");
gets(string);
l=strlen(string);
ptr=(char*)malloc((l+1)*sizeof(char));
p=ptr;
if(ptr==NULL){
printf("n Enter out of memory");
exit(0);
}
for(i=0;i<l;i++){
*ptr=string[i];
ptr++;
}
*ptr=' ';
}
这里有一个解决方案,它的函数可以获取以\0结尾的字符串中的单词数,并将它们放入字符串数组中。这些函数使用strtok,该函数可用于通过分隔符分隔字符串(在我们的情况下为",因为我们希望通过单词分隔字符串(。
一个比较函数";"比较";与sort函数一起使用,可按长度对单词中的字符串进行排序。主要是打印新排序的字符串。
在基本上完成所有操作后,delete words功能将释放内存。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
bool isWhiteSpace(char c) {
return c == ' ' || c == 't' || c == 'n';
}
int getWordCount(char* string) {
bool insideWord = false;
int count = 0;
int i = 0;
while (string[i] != ' ') {
if (!insideWord) {
if (!isWhiteSpace(string[i])) {
insideWord = true;
count++;
}
}
else {
if (isWhiteSpace(string[i])) {
insideWord = false;
}
}
i++;
}
return count;
}
char** getWords(char* inputString, int wordCount) {
char** newArray = (char**)malloc(wordCount * sizeof(char*));
char* word = strtok(inputString, " ");
int i = 0;
while (word != NULL) {
newArray[i] = (char*)malloc((strlen(word) + 1) * sizeof(char));
strcpy(newArray[i], word);
word = strtok(NULL, " ");
i++;
}
return newArray;
}
int compare(const void* s1, const void* s2) {
return strlen(*(char**)s1) - strlen(*(char**)s2);
}
void deleteWords(char** words, int wordCount) {
for (int i = 0; i < wordCount; i++) {
free(words[i]);
}
free(words);
}
int main() {
printf("Enter a string: ");
char* inputString = NULL;
size_t buffersize = 0;
ssize_t inputLength = 0;
// getline doesn't add a .
inputLength = getline(&inputString, &buffersize, stdin);
// replace n with
inputString[inputLength - 1] = ' ';
int wordCount = getWordCount(inputString);
printf("wc: %dn", wordCount);
char** words = getWords(inputString, wordCount);
// Sort the words on length.
qsort(words, (size_t)wordCount, sizeof(char*), compare);
for (int i = 0; i < wordCount; i++) {
printf("%sn", words[i]);
}
// Free up the memory.
deleteWords(words, wordCount);
return 0;
}