程序崩溃,除非打印字符串

时间:2014-10-23 02:53:44

标签: c crash printf

我正在编写一个似乎已经依赖于该行的程序

printf("%s", xStr);

删除此行,将其注释掉,或将其更改为

printf("%s\n", xStr);

会导致我的程序崩溃。是否有任何情况下,删除这一行应该打破一个程序?

编辑:完整代码在

之下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

char *toString(int x){

    char *tmp;
    sprintf(tmp, "%d", x);
    return tmp;

}

int valueOf(char c){

    if(isalpha(c))
        return c - 'A' + 10;
    else
        return c - '0';

}

char *to10(char *xStr, int initBase){

    int tmp = 0, i;

    for(i = 1; i <= strlen(xStr); i++){

        tmp += valueOf(xStr[strlen(xStr) - i])*pow(initBase, i - 1);

    }

    return toString(tmp);

}

char **buildAnsArray(FILE *fp, int n){

    int  i;

    char **ansArray = malloc(sizeof(char)*n);

    for(i = 0; i < n; i++){

        char *item = malloc(10*sizeof(char));
        fscanf(fp, "%s", item);
        ansArray[i] = item;

    }

    return ansArray;
};

char *baseConversion(char *xStr, int initBase, int finBase){

    printf("%s", xStr);

    if(initBase != 10){

        xStr = to10(xStr, initBase);

    }

    int x = atoi(xStr), i = 0;

    while(pow(finBase,i) < x){

        i++;

    }

    char *tmp = malloc(sizeof(char)*i);
    int max = i;

    while(i > 0){

        int divisor = pow(finBase, i - 1);
        int quotient = x/divisor;

        if(quotient > 9){

            tmp[max - i] = 'A' + quotient - 10;

        }

        else{

            tmp[max - i] = (char)(((int)'0')+quotient);

        }

        x -= quotient*divisor;
        i--;

    }

    printf("%s\n", tmp);

    return tmp;


}

char *pow2Converter(int x, int initBase, int finBase){

    x = atoi(baseConversion(x, initBase, 2));
    int chunkSize = log2(finBase);
    int tmp = 0;

    while(x > 0){
        tmp += atoi(baseConversion(toString(x%(int)pow(10,chunkSize)), 2, finBase));
        x /= pow(10,chunkSize);
    }

    return tmp;

}

int findAnswer(char **ansArray, char *xStr, int high, int low){



}

main(){

    FILE *in;
    int num, i;

    in = fopen("data.txt", "r");
    fscanf(in, "%d", &num);

    char **ansArray = buildAnsArray(in, num);

    for(i = 0; i < num; i++){

        int initBase, finBase, ansPos;
        char *xFin, *xInit = malloc(sizeof(char)*10);
        fscanf(in, "%s %d %d", xInit, &initBase, &finBase);
        xFin = baseConversion(xInit, initBase, finBase);
        ansPos = findAnswer(ansArray, xFin, num - 1, 0);
        //printf("%d\n", ansPos);

    }

}

2 个答案:

答案 0 :(得分:4)

你所拥有的是一种Heisenbug,每当你试图看它时它会消失或移动: - )

这通常是由于做了一些未定义的事情,例如:

char *toString(int x){
    char *tmp;
    sprintf(tmp, "%d", x);
    return tmp;
}

不要那样做。你正在创建一个可以指向的指针,然后你就可以向它写信息了。

你甚至无法使用历史悠久的创建数组技术,因为你返回它并且毫无疑问在它超出范围后使用它。

如果您确定不会一次多次调用它(例如使用线程),则可以快速修复此问题:

char *toString (int x) {
    static char tmp[30];
    sprintf(tmp, "%d", x);
    return tmp;
}

答案 1 :(得分:0)

你的代码到底在做什么?它编译并运行但不执行任何操作,因为您的查找答案功能是空的(不确定这是否是您的意图)。如果您可以发布完成的代码,那么它将打印输出,这将有助于我们。

也许还有一些样本数据。我创建了自己的数据,但是当我尝试打印出你们中的一些值时,我会得到奇怪的输出。想要给我们一些数据来阅读和你收到的输出。