Избавиться от конечных чисел в C - PullRequest
1 голос
/ 29 мая 2010

Например,

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char out = printf("teststring");
    printf("%d\n", out);

    return 0;
}

вернет teststring10. У кого-нибудь есть идеи, как избавиться от 10?

Заранее спасибо.

Ответы [ 5 ]

5 голосов
/ 29 мая 2010

Давайте посмотрим на ваш код:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char out = printf("teststring");
    printf("%d\n", out);

    return 0;
}

и изменим его:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    const char *str = "teststring";

    int out = printf("%s", str);
    printf("\nPrintf wrote %d bytes when printing %s\n", out, str);

    return 0;
}

Скомпилируйте / запустите отредактированную версию, и вы должны сразу увидеть разницу.Измените длину str, затем скомпилируйте и запустите ее снова.

Теперь, просто небольшое изменение вашего исходного кода:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char out = printf("teststring\n");
    printf("%d\n", out);

    return 0;
}

Теперь вы видите, что вы печатаете два разныхвещей, и out стало 11, так как была добавлена ​​новая строка.Здесь на самом деле ничего не тянется.Затем измените %d на %c (правильный формат для out в вашем примере) и обратите внимание на разницу.ASCII (11) представляет собой вертикальную вкладку (см. здесь ).YTMV (ваш терминал может отличаться).Здесь вы печатаете символ, а не символьное представление целого числа.

Фактический тип , который возвращает printf(), равен int, что является целым числом.Причина этого в том, что вы точно знаете, сколько байтов printf() фактически напечатано.Это типично для этого семейства функций, но более полезно для таких функций, как snprintf(), поэтому вы можете узнать, не удалось ли вывести всю длину любого заданного формата в буфер.Обратите внимание, что тип возвращаемого значения подписан , он может быть отрицательным, поэтому тип хранилища, который вы выбираете для хранения его значения, имеет большое значение, особенно если вы работаете с этим значением, предполагая, чтоего значение больше или равно нулю.

Вот удобное руководство для форматирования спецификаторов, которые можно использовать с семейством функций printf().Что еще более важно, проверьте тип возвращаемых функций, которые вы используете.

Я также предлагаю провести некоторое время с этой книгой , не забывайте прорабатывать упражнения, если позволяет время.Это лучший курс для самостоятельного изучения языка Си, и упражнения - это весело.Когда вы получите полное представление о C, снова выполните упражнения ... затем сравните свои ответы, открывая глаза:)

0 голосов
/ 29 мая 2010
int printf ( const char * format, ... );

В случае успеха возвращается общее количество написанных символов.

Когда вы выполните это:

char out = printf("teststring");

Строка «testtring» будет напечатана на вашем экране, а значение 10 будет Атрибут для переменной.

Обратите внимание, что курсор печати будет сохранен на текущей строке в конце "testtring", если вы не указали суффикс '\ n' в конце строки.

Итак, когда вы выполняете printf ("% d \ n", out); на следующей строке программа напечатает значение 10 сразу после «testtring», и вы увидите «teststring10 на вашем экране».

Если вы действительно хотите избавиться от 10, просто удалите строку printf ("% d \ n", out); из вашего кода ...

int main (int argc, const char * argv[]) {
    int out = printf("teststring\n");
    /* printf("%d\n", out); */

    return 0;
}
0 голосов
/ 29 мая 2010
int main(int argc, char *argv[])
{
    const char *str = "This is a constant string";

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

    return 0;
}

%s - спецификатор формата для строки. %d - это спецификатор формата для десятичного представления целого числа. printf вернет количество символов, записанных на выходе.

0 голосов
/ 29 мая 2010
#include <stdio.h>

int main (int argc, const char * argv[]) {
    char out = printf("teststring");
    printf("%d\n", out);

    return 0;
}

Предполагая, что вы хотите присвоить "out" функции (как я думаю, вы где-то говорили):

#include <stdio.h>

int main (int argc, const char * argv[]) 
{
    char *out = NULL;

    out = funcReturns("teststring");

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

    return 0;
}

Если вы выделите память внутри функции, которая возвращает «testtring», то я думаю, что вам нужно сделать возвращаемое значение статическим. Например (код не проверен):

char *funcReturns(char *returnStr)
{
    static char *returnThis = NULL;

    returnThis = strdup(returnStr);

    return returnThis;
}
0 голосов
/ 29 мая 2010

10 из-за

printf("%d\n", out);

printf возвращает количество символов, записанных в выходной поток длина "testtring", которая равна 10 "out" и n вы печатаете значение out - так печатается 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...