为啥我的字符排序程序会产生错误的答案?

Posted

技术标签:

【中文标题】为啥我的字符排序程序会产生错误的答案?【英文标题】:Why does my character sorting program produce wrong answers?为什么我的字符排序程序会产生错误的答案? 【发布时间】:2022-01-10 04:04:08 【问题描述】:

我正在尝试用 C 创建一个程序,其中用户将随机字符串插入矩阵。然后程序使用这个公式来评估每个字符串和其余代码以显示具有最高值的字符串。随后的每个字母的值都比前一个更大。

如果有人能指出我正确的方向,我会很高兴,目前程序显示字符串中的一些随机字母。

公式:Sum=(t*26^(n-1))

t = 字母数,n = 剩余字母数

例如:abc -> 1*26^2+2*26^1+3*26^0

其余代码:

#include <stdio.h>
#include <string.h>
void insert(int, char[10][10], int num[]);
int computing(char[10]);
void sort(int, int num[], char[10][10]);
int main()
    int x;
    char arr[10][10];
    int num[x];
    printf("How many words do you wish to enter: \n");
    scanf(" %d", &x);
    insert(x, arr, num);
    sort(x, num, arr);
return 0;

void insert(int x, char arr[10][10], int num[])
    int i, r;
    for(i=0; i<x; i++)
        printf("Insert %d. word: ", i+1);
        scanf("%s", &arr[i][0]);
        num[i] = computing(arr[i]);
    

int computing(char arr[10])
    int n, i, t=1, m=0, k;
    n = strlen(arr);
    k = n;
    for(i=0; i<n; i++) 
        m += (t*26^(k-1));
        t++;
        k = k - 1;
    
return m;

void sort(int x, int num[], char arr[10][10])
    int i, temp;
    char ch;
        for(i = 0; i < x - 1; i++)
            if(num[i] > num[i+1])
                temp = num[i];
                num[i] = num[i+1];
                num[i+1] = temp;
        
                ch = arr[i][0];
                arr[i][0] = arr[i+1][0];
                arr[i+1][0] = ch;
            
        
    printf("Word with the biggest sum is: %s\n", &arr[x-1][0]);

【问题讨论】:

您是否认为^ 运算符是求幂(即26^(k-1) 将26 提高到k-1 的幂)?因为它不是......它是一个异或(按位)运算符。 事实上,C 没有求幂运算符。 The most efficient way to implement an integer based power function pow(int, int). 另外,scanf 格式应为“%c”或“%1s”。我相信“%s”会查找多个以空格结尾的字符。 请注意,您的函数computing(char arr[10]) 不使用字符串中的任何实际字符,因此所有相同长度的字符串将具有相同的“值”。使用"abc" 的例子很糟糕,因为它不能消除"t = number of the letter" 的歧义。另外,您确定int 可以保持这种基于功率的值吗? int num[x];高于scanf(" %d",&amp;x);,所以x未初始化。将int num[x]; 下方移动到scanf 【参考方案1】:

问题:

    ^ 不是幂函数 int num[x]; 位于 scanf(" %d",&amp;x); 上方,因此 x 未初始化。将int num[x]; 移动到scanf 下方 排序已损坏。即使进行了上述修复,它也会损坏我提供的测试数据条目。 排序需要对数据执行 N 次传递。目前,它只做一个。 arr 硬连线在 char arr[10][10];。它应该像num 一样是动态的:char arr[x][10];

定义一个struct 更容易,它同时具有单词字符串(在arr 中)它的num 分数。然后,排序不必只交换一个 两个 数组。


所以,我重构了代码以使用这样的struct 并修复了排序和其他问题。有注释:

#include <stdio.h>
#include <string.h>

typedef struct 
    int num;                            // ranking
    char str[10];                       // word string
 word_t;

void insert(int, word_t num[]);
int computing(word_t *);
void sort(int, word_t num[]);

int
main(void)

    int x;
// NOTE/BUG: x is _not_ yet initialized
#if 0
    char arr[10][10];
    int num[x];
#endif

    printf("How many words do you wish to enter: \n");
    scanf(" %d", &x);

// NOTE/FIX: x is now initialized
#if 1
    word_t words[x];
#endif

    insert(x, words);

    sort(x, words);

    return 0;


void
insert(int x, word_t *words)

    int i;

    for (i = 0; i < x; i++) 
        word_t *word = &words[i];

        printf("Insert %d. word: ", i + 1);
        scanf("%s", word->str);

        word->num = computing(word);
        printf("DEBUG: num=%d '%s'\n",word->num,word->str);
    


int
computing(word_t *word)

    int n, i,
        t = 1,
        m = 0,
        k;

    n = strlen(word->str);
    k = n;

// NOTE/FIX: compute pow(26,k - 1);
#if 1
    int p26 = 1;
    for (i = 1; i <= (k - 1); ++i)
        p26 *= 26;
#endif

    for (i = 0; i < n; i++) 
#if 0
        m += (t * 26 ^ (k - 1));
#else
        m += (t * p26);
#endif
        t++;

        k = k - 1;
// NOTE/FIX: recalc pow(26,k - 1) now that we've decremented k
#if 1
        p26 /= 26;
#endif
    

    return m;


void
sort(int x, word_t *words)

    int i;
    word_t temp;
    int more = 1;

    while (more) 
        more = 0;

        for (i = 0; i < x - 1; i++) 
            word_t *lhs = &words[i];
            word_t *rhs = &words[i + 1];

            if (lhs->num > rhs->num) 
                temp = *lhs;
                *lhs = *rhs;
                *rhs = temp;
                more = 1;
            
        
    

    printf("Word with the biggest sum is: %s\n", words[x - 1].str);


这是我使用的输入数据:

7
abc
defg
hijkl
mnopqr
hello
world
gbye

注意在原始代码中,程序打印出mbye作为答案


这是程序输出:

How many words do you wish to enter:
Insert 1. word: DEBUG: num=731 'abc'
Insert 2. word: DEBUG: num=19010 'defg'
Insert 3. word: DEBUG: num=494265 'hijkl'
Insert 4. word: DEBUG: num=12850896 'mnopqr'
Insert 5. word: DEBUG: num=494265 'hello'
Insert 6. word: DEBUG: num=494265 'world'
Insert 7. word: DEBUG: num=19010 'gbye'
Word with the biggest sum is: mnopqr

未来可能出现的问题/修复。请注意num 的值对于helloworld相同。如果我们要麻烦地将一个数字提高到一个幂,这些数字应该不同吗?

【讨论】:

以上是关于为啥我的字符排序程序会产生错误的答案?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我使用 `useRef` 创建的我的参考会产生此错误消息?

为啥我的递归会产生意外错误?以及如何在到达循环时修改递归?

为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?

为啥命令行参数在访问时会产生分段错误?

为啥我会收到“您的请求产生错误”。 [newNullResponse]' 在我的应用程序的 iTunes 页面上?

C++/openCV - 为啥显示图像会产生 linux 分段错误? (openCV 错误?)