【问题标题】:Program crashes unless string is printed除非打印字符串,否则程序崩溃
【发布时间】:2014-10-23 02:53:44
【问题描述】:

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

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);

    }

}

【问题讨论】:

  • 请编辑您的问题并包含完整代码,一行不足以帮助我们调试
  • 您需要了解更多关于指针和内存分配的知识。这么多错误。
  • 我同意。我在 C 方面的唯一经验是 2 个月的计算机科学 1. 你会做哪些不同的事情?
  • 除了@paxdiablo 的回答之外,还有其他一些:fscanf(fp, "%s", item);char *xFin, *xInit = malloc(sizeof(char)*10);。看看它们,要么是这些线条,要么是它们周围的线条。看看你能不能自己找出错误。

标签: c crash printf


【解决方案1】:

你拥有的是一只 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;
}

【讨论】:

  • 你去吧,@Barmar :-)
  • @Baramar - 是的,我很确定我不会在我的 C 入门课程中使用多个线程 :)。我会试试你的建议
【解决方案2】:

您的代码到底在做什么?它编译并运行但不执行任何操作,因为您的 find answer 函数为空(不确定这是否是您的意图)。如果您可以发布完成的代码,那么它会打印对我们有帮助的输出。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2020-04-29
    相关资源
    最近更新 更多