printf (), fprintf (), wprintf () и NSlog () не будут печататься в XCode - PullRequest
0 голосов
/ 29 марта 2012

Я делаю небольшое приложение для оценки и анализа передаточных функций. Как бы скучно ни казался этот предмет, я хочу, чтобы он выглядел по крайней мере очень круто, профессионально, круто и т. Д. Итак:

  • Шаг 1: Дайте мне коэффициенты! [Куча цифр]
  • Шаг 2: Я напишу полином с его верхним индексом. [Связка чисел в строке]

Итак, я пишу небольшой синтаксический анализатор C, чтобы просто напечатать многочлен в достойном формате, для этого мне требуется строка wchar_t, которую я объединяю на лету. После завершения строки я быстро пытаюсь распечатать ее на консоли, чтобы проверить, все ли в порядке и продолжить работу. Легко ли? Уэлп, мне не так повезло ...

wchar_t *polynomial_description( double *polyArray, char size, char var ){

    wchar_t *descriptionString, temp[100];
    int len, counter = 0;
    SUPERSCRIPT superscript;

    descriptionString = (wchar_t *) malloc(sizeof(wchar_t) * 2);
    descriptionString[0] = '\0';

    while( counter < size ){

        superscript = polynomial_utilities_superscript( size - counter );
        len = swprintf(temp, 100, L"%2.2f%c%c +", polyArray[counter], var, superscript);
        printf("temp size: %d\n", len);

        descriptionString = (wchar_t *) realloc(descriptionString, sizeof(wchar_t) * (wcslen(descriptionString) + len + 1) );
        wcscat(descriptionString, temp);

        counter++;

    }

    //fflush(stdout); //Already tried this
    len = wprintf(L"%ls\n", descriptionString);
    len = printf("%ls**\n", descriptionString);
    len = fprintf(stdout, "%ls*\n", descriptionString);
    len = printf("FFS!! Print something!");

    return descriptionString;

}

Во время прогона мы видим, как temp size: 8 печатает ожидаемое количество раз ТОЛЬКО ПРИ ОТЛАДКЕ, если я запускаю программу, я получаю произвольное количество отпечатков за каждый прогон. Но после этого, как говорится в заголовке, wprintf, printf и fprintf ничего не печатают, а len меняет свой размер после каждого вызова.

В функции вызывающей стороны (application:(UIApplication *)application didFinishLaunchingWithOptions: во время тестирования) я помещаю NSLog для печати возвращаемой строки, и я НИЧЕГО не получаю, даже часть журнала.

Что происходит? Я в полной растерянности.

Кстати, я на XCode 4.2.

1 Ответ

2 голосов
/ 29 марта 2012

Какое значение возвращается из printf / wprintf в том случае, если вы думаете, что оно ничего не печатает? Он должен возвращать либо -1 в случае сбоя, либо 1 или более, поскольку в случае успеха он всегда должен печатать как минимум символ новой строки после строки описания.

  • Если возвращается 1 или больше, печатается ли новая строка? Вы пытались передать выходные данные вашей программы в шестнадцатеричный дампер, такой как hexdump -C или xxd(1)?
  • Если он возвращает -1, каково значение errno?

Если выясняется, что printf завершается с ошибкой EILSEQ, то вполне вероятно, что ваша строка содержит некоторые символы, не входящие в ASCII, поскольку они вызывают wcstombs(3) потерпеть неудачу в локали C по умолчанию. В этом случае решение состоит в том, чтобы использовать setlocale(3) для переключения на локаль UTF-8 при запуске вашей программы:

int main(int argc, char **argv)
{
    // Run "locale -a" in the Terminal to get a list of all valid locales
    setlocale(LC_ALL, "en_US.UTF-8");
    ...
}
...