我对计算整数对数的整个部分的函数有一个小问题。这是我的案例的一个细节,但我想理解它;)
正如你所看到的测试它,我的代码只是一个冒泡排序函数,我的问题与名为 log_entier 的函数相关(因为 log 9 在这里是 2 而不是 1,我不明白......)
注意 log_entier 的参数应该 > 0
提前非常感谢!
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void echanger_elements(char *s, unsigned i1, unsigned i2) //echange deux elements d'une chaine dont on donne les indices
{
char element = s[i1];
s[i1] = s[i2];
s[i2] = element;
}
int log_entier(int n)
{
int log = -1;
for (; n; n/=10)
log++;
return log;
}
char *print_digits(char n)
{
char *s;
s = malloc((3 - log_entier(n))*sizeof(char));
int i;
for (i = 3 - log_entier(n); i; i--)
{
s[i - 1] = ' ';
}
return s;
}
void bubblesort(char *s) //trie une chaine de caractères en fonction de l'ordre de la table ascii
{
int i;
char plus_grand_el;
char sorting;
unsigned etape = 1;
unsigned permutations = 0;
while(1)
{
plus_grand_el = 0;
sorting = 0;
for (i = 1; i < strlen(s); i++)
{
if (s[i] < s[plus_grand_el])
{
sorting = 1;
echanger_elements(s, i, plus_grand_el);
permutations++;
}
plus_grand_el++;
}
printf(" Étape %s %d : %s\n", print_digits(etape), etape++, s);
if (sorting == 0)
{
printf(" ***La chaîne a été triée à l'aide de %d!***\n", permutations);
break;
}
}
}
int main()
{
char chaine[] = "ZZTHelXlo56456Wordl1265";
bubblesort(chaine);
}
我期待这样的事情:
Étape 1 : ZTHZeXll56456Woodl1265r
Étape 2 : THZZXel56456Wlodl1265or
Étape 3 : HTZXZe56456Wlldl1265oor
Étape 4 : HTXZZ56456Weldl1265loor
Étape 5 : HTXZ56456WZedl1265lloor
Étape 6 : HTX56456WZZde1265llloor
Étape 7 : HT56456WXZZd1265ellloor
Étape 8 : H56456TWXZZ1265dellloor
Étape 9 : 56456HTWXZ1265Zdellloor
Étape 10 : 54566HTWX1265ZZdellloor
Étape 11 : 45566HTW1265XZZdellloor
Étape 12 : 45566HT1265WXZZdellloor
Étape 13 : 45566H1265TWXZZdellloor
Étape 14 : 455661265HTWXZZdellloor
Étape 15 : 455612656HTWXZZdellloor
Étape 16 : 455126566HTWXZZdellloor
Étape 17 : 451255666HTWXZZdellloor
Étape 18 : 412555666HTWXZZdellloor
Étape 19 : 124555666HTWXZZdellloor
Étape 20 : 124555666HTWXZZdellloor
***La chaîne a été triée à l'aide de 142!***
而不是
Étape 1 : ZTHZeXll56456Woodl1265r
Étape 2 : THZZXel56456Wlodl1265or
Étape 3 : HTZXZe56456Wlldl1265oor
Étape 4 : HTXZZ56456Weldl1265loor
Étape 5 : HTXZ56456WZedl1265lloor
Étape 6 : HTX56456WZZde1265llloor
Étape 7 : HT56456WXZZd1265ellloor
Étape 8 : H56456TWXZZ1265dellloor
Étape 9 : 56456HTWXZ1265Zdellloor
Étape 10 : 54566HTWX1265ZZdellloor
Étape 11 : 45566HTW1265XZZdellloor
Étape 12 : 45566HT1265WXZZdellloor
Étape 13 : 45566H1265TWXZZdellloor
Étape 14 : 455661265HTWXZZdellloor
Étape 15 : 455612656HTWXZZdellloor
Étape 16 : 455126566HTWXZZdellloor
Étape 17 : 451255666HTWXZZdellloor
Étape 18 : 412555666HTWXZZdellloor
Étape 19 : 124555666HTWXZZdellloor
Étape 20 : 124555666HTWXZZdellloor
***La chaîne a été triée à l'aide de 142!***
在测试您的程序时,我注意到编译器发出了一个警告,说明您试图将信息打印和递增“etape”计数器结合在一起。
/home/craig/C_Programs/Console/Log/main.c|55|warning: operation on ‘etape’ may be undefined [-Wsequence-point]|
此警告引用了您的打印声明。
printf(" Stage %s %d : %s\n", print_digits(etape), etape++, s);
通常警告表明可能存在未定义的行为。这样,我还体验到了输出中第九行的偏移。
craig@Vera:~/C_Programs/Console/Log/bin/Release$ ./Log
Stage 1 : ZTHZeXll56456Woodl1265r
Stage 2 : THZZXel56456Wlodl1265or
Stage 3 : HTZXZe56456Wlldl1265oor
Stage 4 : HTXZZ56456Weldl1265loor
Stage 5 : HTXZ56456WZedl1265lloor
Stage 6 : HTX56456WZZde1265llloor
Stage 7 : HT56456WXZZd1265ellloor
Stage 8 : H56456TWXZZ1265dellloor
Stage 9 : 56456HTWXZ1265Zdellloor
Stage 10 : 54566HTWX1265ZZdellloor
Stage 11 : 45566HTW1265XZZdellloor
Stage 12 : 45566HT1265WXZZdellloor
Stage 13 : 45566H1265TWXZZdellloor
Stage 14 : 455661265HTWXZZdellloor
Stage 15 : 455612656HTWXZZdellloor
Stage 16 : 455126566HTWXZZdellloor
Stage 17 : 451255666HTWXZZdellloor
Stage 18 : 412555666HTWXZZdellloor
Stage 19 : 124555666HTWXZZdellloor
Stage 20 : 124555666HTWXZZdellloor
***The string was sorted using 142!***
确定所需的是打印阶段,然后递增变量,以下是为此目的重构的代码。
printf(" Stage %s %d : %s\n", print_digits(etape), etape, s);
etape++;
编译此重构代码时,编译器不再发出有关变量递增的警告。以下是最终的测试输出。
craig@Vera:~/C_Programs/Console/Log/bin/Release$ ./Log
Stage 1 : ZTHZeXll56456Woodl1265r
Stage 2 : THZZXel56456Wlodl1265or
Stage 3 : HTZXZe56456Wlldl1265oor
Stage 4 : HTXZZ56456Weldl1265loor
Stage 5 : HTXZ56456WZedl1265lloor
Stage 6 : HTX56456WZZde1265llloor
Stage 7 : HT56456WXZZd1265ellloor
Stage 8 : H56456TWXZZ1265dellloor
Stage 9 : 56456HTWXZ1265Zdellloor
Stage 10 : 54566HTWX1265ZZdellloor
Stage 11 : 45566HTW1265XZZdellloor
Stage 12 : 45566HT1265WXZZdellloor
Stage 13 : 45566H1265TWXZZdellloor
Stage 14 : 455661265HTWXZZdellloor
Stage 15 : 455612656HTWXZZdellloor
Stage 16 : 455126566HTWXZZdellloor
Stage 17 : 451255666HTWXZZdellloor
Stage 18 : 412555666HTWXZZdellloor
Stage 19 : 124555666HTWXZZdellloor
Stage 20 : 124555666HTWXZZdellloor
***The string was sorted using 142!***
这里的主要要点是始终检查编译器列表中是否有任何可能指向未定义行为的警告。 “C”编程语言确实允许组合和压缩操作;然而,有时最好将诸如递增变量之类的步骤分开(以便将来的代码分析更容易)。
用它来思考。