Есть ли способ указать, сколько символов строки нужно распечатать с помощью printf ()?
есть ли способ указать, сколько символов строки нужно распечатать (подобно десятичным знакам в int
s)?
printf ("Here are the first 8 chars: %sn", "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, так что используйте %.8С.
Если вы хотите всегда печатать ровно 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, которые слишком коротки, но я думаю, что это может быть безопаснее.
В C++, я делаю это таким образом:
char *buffer = "My house is nice"; string showMsgStr(buffer, buffer + 5); std::cout << showMsgStr << std::endl;
обратите внимание, что это небезопасно, потому что при передаче второго аргумента я могу выйти за пределы размера строки и создать нарушение доступа к памяти. Вы должны реализовать свою собственную проверку, чтобы избежать этого.