【问题标题】:Extra values when printing an array(converting from %s to %c)打印数组时的额外值(从 %s 转换为 %c)
【发布时间】:2016-11-12 11:54:45
【问题描述】:

我正在尝试创建一个简单的程序,用户必须输入一系列数字,程序应该输出给定数字的正方形和立方体。但是,当我尝试使用数组时,它会打印一些我什至没有输入的随机数。任何帮助将不胜感激,以消除不必要的输入。谢谢。

#include <stdio.h>
int main()
{
    char *value;
    value = malloc(sizeof(20));
    float answer;
    int x;
    int y;

    scanf("%s" , value);

    for(x=0; x < 20; x++)
    {
        y = value[x] - '0';
        printf("\nThe square of %d is: %d" , y , y*y);
        printf("\nThe cube of %d is: %d \n" , y , y*y*y);
    }

    return 0;
}

【问题讨论】:

    标签: c arrays pointers malloc scanf


    【解决方案1】:

    您正在输入 char 并对其进行算术运算。

    使用这段代码,它会给你正确的输出。

    #include <stdio.h>
    int main()
    {
        int *value;
        value = (int *)malloc(20 * sizeof(int));
        //float answer;
        int x;
        int y;
        for(x=0; x < 20; x++)
        {
            scanf("%d" , value + i);
        }
    
        for(x=0; x < 20; x++)
        {
            y = value[x];
            printf("\nThe square of %d is: %d" , y , y*y);
            printf("\nThe cube of %d is: %d \n" , y , y*y*y);
        }
    
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      问题在于您的 malloc 语句。
      sizeof 用于确定参数大小 - 在您的情况下是硬编码整数。生成的数组大小为 4,正好是 sizeof(20),而不是 20 个整数,即 20*sizeof(int)。如果您知道需要什么大小,最好静态分配数组,请参见下面的代码:

      #include <stdio.h>
      int main()
      {
          // This line sets value to an array of 20 ints
          int value[20];
          // Another, less favorable option, but still works:
          // char *value = malloc(20 * sizeof(int))
          float answer;
          int x;
          int y;
      
          scanf("%s" , value);
      
          for(x=0; x < 20; x++)
          {
              y = value[x] - '0';
              printf("\nThe square of %d is: %d" , y , y*y);
              printf("\nThe cube of %d is: %d \n" , y , y*y*y);
          }
      
          return 0;
      }
      

      【讨论】:

        【解决方案3】:

        表达式sizeof(20) 返回int 的大小(文字20int),通常只有4 个字节。换句话说,你只是为你的数组分配一个 single 整数。该单个整数之外的所有访问都将导致未定义的行为

        如果要动态分配内存,则需要分配 sizeof(int) 乘以元素数。或者(我推荐)使用普通数组:

        int value[20];
        

        还有另一个问题,您只能从用户那里读取一个值。您可能也应该在循环中阅读。

        但是,如果您在循环中读取,那么实际上甚至不需要一个数组开头,只需读取一个 int 变量,然后将其值打印为平方和立方。

        所以代码可以简化为

        #include <stdio.h>
        
        int main(void)
        {
            int value;
            for (unsigned i = 0; i < 20 && scanf("%d", &value) == 1; ++i)
            {
                printf("The square of %d is: %d\n", value, value * value);
                printf("The cube of %d is: %d\n", value, value * value * value);
            }
        
            return 0;
        }
        

        乘法时还需要注意溢出。

        【讨论】:

          猜你喜欢
          • 2020-07-04
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 2012-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多