完整的日志功能

问题描述 投票:0回答:1

我对计算整数对数的整个部分的函数有一个小问题。这是我的案例的一个细节,但我想理解它;)

正如你所看到的测试它,我的代码只是一个冒泡排序函数,我的问题与名为 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!***

c printf digits
1个回答
0
投票

在测试您的程序时,我注意到编译器发出了一个警告,说明您试图将信息打印和递增“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”编程语言确实允许组合和压缩操作;然而,有时最好将诸如递增变量之类的步骤分开(以便将来的代码分析更容易)。

用它来思考。

© www.soinside.com 2019 - 2024. All rights reserved.