打印数组时的额外值(从%s转换为%c)

时间:2016-07-10 11:59:42

标签: c arrays pointers malloc scanf

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

#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;
}

3 个答案:

答案 0 :(得分:0)

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

如果要动态分配内存,则需要分配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;
}

乘法时还需要注意溢出。

答案 1 :(得分:0)

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

使用此代码,它将为您提供正确的输出。

SetSize

答案 2 :(得分:0)

问题在于您的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;
}