2014-10-23 3 views
1

Я пишу программу, которая, кажется, стали зависимыми от линиисбой программы, если строка не печатается

printf("%s", xStr); 

Удаление этой линии, комментируя его, или изменить его на

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

приведет к сбою моей программы. Есть ли какие-либо обстоятельства, когда-либо, при которых удаление этой строки должно нарушать программу?

Edit: Полный код ниже

#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

Пожалуйста, отредактируйте ваш вопрос и включите полный код, одной строки недостаточно, чтобы помочь нам отладить – Parker

+0

Вам нужно больше узнать о указателях и распределении памяти. Так много ошибок. –

+0

Согласен. Мой единственный опыт в C - это 2 месяца компьютерных наук 1. Что бы вы сделали по-другому? –

ответ

4

Что у вас есть это гейзенбаг, одна, которая исчезает или движется, когда вы пытаетесь смотреть на него :-)

Это обычно вызвано делать что-то неопределенное , такие как:

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; 
} 
+0

скажите ему, как это исправить, и я подниму вас – Barmar

+0

Там вы, @Barmar :-) – paxdiablo

+0

@Baramar - Да, я уверен, что я не буду работать с несколькими потоками в своем вступительном курсе C :) , Я попробую ваше предложение –

0

Что именно является вашей код делает? Он компилируется и запускается, но ничего не делает, потому что функция ответа на поиск осталась пустой (не уверен, что это было вашим намерением). Если вы можете опубликовать готовый код, чтобы он печатал вывод, который нам помог.

и, возможно, некоторые данные образца. Я создал свои собственные данные, но я получаю нечетные результаты при попытке распечатать некоторые из ваших значений. Хотите дать нам некоторые данные для чтения и ваш результат, который вы получите.

Смежные вопросы