【问题标题】:Converting chars to integers is creating a negative number?将字符转换为整数是创建一个负数?
【发布时间】:2021-01-22 19:55:29
【问题描述】:

我试图找到一个字符数组的平均值。我假设我需要在对它们执行数学运算之前将字符转换为整数,所以我这样做,然后在最后将其转换回字符。

我看到的问题是任何 3 位数的字符都在转换为负整数值。两位数的值完美打印出来。我可以通过在 for 循环中执行打印语句来看到这一点。请参阅下面的输出:

我的代码如下:

void main() {
  int max;
  int min;
  int median;
  int mean;

  unsigned char test[SIZE] = { 34, 201, 190, 154,   8, 194,   2,   6,
                              114, 88,   45,  76, 123,  87,  25,  23,
                              200, 122, 150, 90,   92,  87, 177, 244,
                              201,   6,  12,  60,   8,   2,   5,  67,
                                7,  87, 250, 230,  99,   3, 100,  90};


  mean = find_mean(test);
  printf("%d", mean);
  /* Statistics and Printing Functions Go Here */

}

char find_mean(char * x) {
  
 int value = 0;
 int sum = 0; 
 int mean = 0;
 char mean_char;   

  for (int i = 0; i < SIZE; i++) {
    int value = x[i];
    printf("%d\n", value);
    sum += value;
  }

  printf("%d", sum);
  mean = sum/SIZE;
  mean_char = mean;
  return mean_char;  

}

【问题讨论】:

  • 您在一个地方使用了unsigned char,但不是全部。为什么?
  • 请不要发布文字图片。您可以将控制台窗口中的文本直接复制并粘贴到您的帖子中。

标签: c function loops char integer


【解决方案1】:

改变这个:

char find_mean(char * x)

到这里:

unsigned char find_mean(unsigned char * x)

因为您的数组是unsigned char 类型。相同的变化:

char mean_char;

到:

unsigned char mean_char;

现在您的输出是(将 sum print 更改为 printf("%d\n", sum); 后):

...
3759
mean = 93

这是正确的,因为 SIZE 是 40,所以 3759/40 = 93。


启用编译器警告以轻松发现此类问题。例如在通过-Wall -Wextra 标志的 GCC 中,我得到:

prog.c:22:20: warning: pointer targets in passing argument 1 of 'find_mean' differ in signedness [-Wpointer-sign]
   22 |   mean = find_mean(test);
      |                    ^~~~
      |                    |
      |                    unsigned char *
prog.c:7:23: note: expected 'char *' but argument is of type 'unsigned char *'
    7 | char find_mean(char * x);
      |                ~~~~~~~^

【讨论】:

  • 谢谢,我应该多注意字符类型的!
猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多