printf()
nie spełni cel OP w jednym kroku przy użyciu jakiegoś specjalnego formatu. Użycie sprintf()
do utworzenia początkowego wyniku tekstowego jest dobrym pierwszym krokiem, należy zachować ostrożność podczas próby "matematycznego" manipulowania ciągami.
Usunięto odpowiedź z usuniętą odpowiedzią na @user3121023.
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
int printf_NoIntegerPart(double x, int prec) {
assert(prec >= 2 && prec <= 100);
char buffer[prec + 16]; // Form a large enough buffer.
sprintf(buffer, "%.*E", prec - 1, x);
int dp = '.'; // Could expand code here to get current local's decimal point.
char *dp_ptr = strchr(buffer, dp);
char *E_ptr = strchr(buffer, 'E');
// Insure we are not dealing with infinity, Nan, just the expected format.
if (dp_ptr && dp_ptr > buffer && E_ptr) {
// Swap dp and leading digit
dp_ptr[0] = dp_ptr[-1];
dp_ptr[-1] = dp;
// If x was not zero …
if (x != 0) {
int expo = atoi(&E_ptr[1]); // Could use `strtol()`
sprintf(&E_ptr[1], "%+.02d", expo + 1);
}
}
return puts(buffer);
}
int main(void) {
printf_NoIntegerPart(2.74600E+02, 5); // ".27460E+03"
return 0;
}
Potrzebuję nakarmić go do starego pliku wykonywalnego fortranu – avances123
Manipulacja tekstem wydaje się być najlepszą drogą. Możesz szukać biblioteki, ale domyślam się, że nikt nie obsługuje tak dziwnego formatu. –
https://www.google.com/search?q=c%2B%2B+print+fortran+format –