C程序运行后立即退出?

时间:2014-11-05 08:19:48

标签: c

嘿,我有一个关于我写过的程序的快速问题。出于某种原因,它在运行后立即退出。我跑步时没有错误,但显然有些错误。

因为我根本无法让它运行,所以我无法测试它以确保它完全符合我的需要。

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#define MAXCHARS 31

struct TempInfo
    {
        char city[MAXCHARS];
        int day;
        double fahr;
        double cels;
    };

void input_TempInfo(struct TempInfo * arr, int size);
void print_TempInfo(struct TempInfo * arr, int size);

void main(int argc, char *argv[])
{
    int size;
    struct TempInfo arr[size];
    struct TempInfo * arrPtr;
    arrPtr = arr;

    do
    {
        printf("How many cities / days / temps would you like to enter? ");
        scanf("%i", &size);
        if (size < 1 || size > 20)
        {
            printf("Not a valid number. Type another: ");
            scanf("%i", &size);
        }
    } while (size >= 1 && size <= 20);

    input_TempInfo(arrPtr, size);
    print_TempInfo(arrPtr, size);

    return 0;
}

void input_TempInfo(struct TempInfo * arr, int size)
{
    int i, k;

    for (i = 0, k = 0; k < size; i++, k++)
    {
        printf("Enter the city: ");
        while (((arr[k].city[i] = getchar()) != '\n') && (i < MAXCHARS))
            i++;
        arr[k].city[i] = '\0';

        do
        {
            printf("Enter the day: ");
            scanf("%i", &arr[k].day);
            if (arr[k].day < 1 || arr[k].day > 366)
            {
                printf("Invalid day number. Type another: ");
                scanf("%i", &arr[k].day);
            }
        } while (arr[k].day >= 1 && arr[k].day <= 366);

        printf("Enter a temperature in Fahrenheit: ");
        scanf("%lf", &arr[k].fahr);

        arr[k].cels = (arr[k].fahr - 32) * 5/9;
    }
}

void print_TempInfo(struct TempInfo * arr, int size)
{
    int i, k;

    for (i = 0, k = 0; k < size; i++, k++)
    {
        printf("City\tDay\tFahr\tCels");
        printf("------------------------------");
        printf("%s\t%i\t%.1lf\t%.1lf",
            arr[k].city, arr[k].day, arr[k].fahr, arr[k].cels);
    }
}

编辑我将我的'arr [size]'和'* arrPtr'的声明重新排列在'do while'之后,并且效果更好。非常感谢你们。

1 个答案:

答案 0 :(得分:7)

此代码块

int size;
struct TempInfo arr[size];
struct TempInfo * arrPtr;
arrPtr = arr;

错误:您使用的是VLA(可变长度数组,此处arr)未初始化size

我希望如果您编译所有警告和调试信息(如果使用GCC gcc -Wall -Wextra -g),您会收到警告。不幸的是,情况并非如此(使用GCC 4.9),除非您还要求优化(因此gcc -Wall -Wextra -O -g我收到警告)。所以请在GCC bugzilla

上提交错误

至少,在该块之前移动do ... while(size >= 1 && size <= 20);循环。阅读您正在使用的每个功能的文档。请注意,scanf(3)正在返回已成​​功扫描的项目的计数,您应该对其进行测试!

顺便说一句,你应该学习如何使用调试器(例如gdb