Есть ли способ указать, сколько символов строки нужно распечатать с помощью printf ()?

есть ли способ указать, сколько символов строки для печати (подобно десятичным знакам в ints)?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

хотел бы, чтобы он напечатал:Here are the first 8 chars: A string

8 ответов


основной способ-это:

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

другой, часто более полезный, способ:

printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");

здесь вы указываете длину в качестве аргумента int для printf (), который обрабатывает " * " в формате как запрос на получение длины из аргумента.

вы также можете использовать нотацию:

printf ("Here are the first 8 chars: %*.*s\n",
        8, 8, "A string that is more than 8 chars");

это также аналогично нотации "%8.8 s" , но опять же позволяет указать минимальную и максимальную длины во время выполнения-более реалистично в сценарии например:

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

%8s указывает минимальную ширину 8 символов. Вы хотите усечь на 8, поэтому используйте %.8s.

Если вы хотите всегда печатать ровно 8 символов, вы можете использовать %8.8 s


используя printf можно сделать

printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

если вы используете C++, вы можете достичь того же результата, используя STL:

using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;

или, что менее эффективно:

cout << "Here are the first 8 chars: " <<
        string(s.begin(), s.begin() + 8) << endl;

кроме того, чтобы указать фиксированное количество символов, вы также можете использовать * что означает, что printf принимает количество символов из аргумента:

#include <stdio.h>

int main(int argc, char *argv[])
{
        const char hello[] = "Hello world";
        printf("message: '%.3s'\n", hello);
        printf("message: '%.*s'\n", 3, hello);
        printf("message: '%.*s'\n", 5, hello);
        return 0;
}

принты:

message: 'Hel'
message: 'Hel'
message: 'Hello'

печать первых четырех символов:

printf("%.4s\n", "A string that is more than 8 chars");

посмотреть этой ссылке для получения дополнительной информации (регистрация .precision-section)


В C++ это легко.

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));

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


printf(....."%.8s")


В C++ я делаю это следующим образом:

char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;

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