在c中使用多维数组存储来自用户的一行,并根据字长按降序返回该行中的单词

Posted

技术标签:

【中文标题】在c中使用多维数组存储来自用户的一行,并根据字长按降序返回该行中的单词【英文标题】:Using multidymentional array in c store a line from the user and return the words in the line in decending order according to the word length 【发布时间】:2020-12-17 22:25:25 【问题描述】:

编写一个程序,从用户那里读取一行,直到用户按下回车键('\n')。存储一行的所有单词 成多维动态数组。然后将此数组传递给函数 SortString(),该函数将对所有 按字长排列的单词,即最长的单词将被放置在第一个索引处,然后第二长的单词将是 放置在第二个索引处,依此类推。最后将排序后的单词列表返回给主函数,其中 所有的单词都会以每行一个单词的形式打印到屏幕上。假设该行包含所有唯一的 单词。

我在这里编写了一些代码,但是我遇到了如何对行中单词的长度进行排序并按降序打印它们的问题。

#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';  

【问题讨论】:

如果你也能展示你的排序函数“sortString()”会很有帮助 如果您的字符串长度限制为 50 字节,为什么还要使用 malloc? Matheus 那我该怎么办,如果用户输入一大行怎么办。 【参考方案1】:

这是一个解决方案,它具有可以获取 \0 终止字符串中的单词数并将它们放入字符串数组的函数。这些函数使用 strtok ,它可用于通过分隔符分割字符串(在我们的例子中是 ' ',因为我们想用单词来分割字符串)。

比较函数“compare”与排序函数一起使用,以按长度对单词中的字符串进行排序。在 main 中打印新排序的字符串。

在main中完成所有操作后,删除单词功能释放内存。

#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] != '\0') 
        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 \0.
    inputLength = getline(&inputString, &buffersize, stdin);
    // replace \n with \0
    inputString[inputLength - 1] = '\0';

    int wordCount = getWordCount(inputString);
    printf("wc: %d\n", 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("%s\n", words[i]);
    

    // Free up the memory.
    deleteWords(words, wordCount);

    return 0;    

【讨论】:

Carl 我看不到你的 getline() 函数。 getline 来自 stdlib.h 它可以完成您尝试使用 get 执行的操作。但是,gets 被认为是不安全的,因此从 STL 中删除并替换为 getline 和 fgets

以上是关于在c中使用多维数组存储来自用户的一行,并根据字长按降序返回该行中的单词的主要内容,如果未能解决你的问题,请参考以下文章

多维数组如何存储在内存中? [复制]

来自 C 函数的多维字符数组返回错误

《C专家编程》数组和指针并不同--多维数组

c#将字符串拆分为多维数组?

如何使用 jquery 创建具有来自动态创建的表单字段的值的多维数组?

关于多维数组的注意事项