我正在编写一个似乎已经依赖于该行的程序
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);
}
}
答案 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)
你的代码到底在做什么?它编译并运行但不执行任何操作,因为您的查找答案功能是空的(不确定这是否是您的意图)。如果您可以发布完成的代码,那么它将打印输出,这将有助于我们。
也许还有一些样本数据。我创建了自己的数据,但是当我尝试打印出你们中的一些值时,我会得到奇怪的输出。想要给我们一些数据来阅读和你收到的输出。