我正在写一个程序,看起来似乎越来越依赖
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);
}
}
最佳答案
你所拥有的是一个海森氏病,当你试图看着它时它就会消失或移动:-)
通常是由于执行一些 undefined 的操作引起的,例如:
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;
}
关于c - 除非打印字符串,否则程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26520556/