Проблема, с которой я столкнулся, связана с типом данных intptr_t
и тем, как fprintf()
принимает аргументы для формата %.*s
. Формат %.*s
предполагает, что точность поля будет иметь тип int
, и, возможно, это не лишено смысла само по себе.
Но не в этом случае:
#include <stdio.h>
#include <stdint.h>
int main() {
char fname[] = "Some_File.txt";
FILE *write = fopen(fname,"w");
if(write!=NULL){
printf("\n\tType below :\n\n");
char in[501]=""; char *p;
while(1){
fgets(in,MAX_LN,stdin);
/*** Region with compiler warnings begins ***/
if((p=strstr(in,"/end/"))!=0){
intptr_t o = p-in;
fprintf(write,"%.*s",o,in);
/*** Region with compiler warnings ends ***/
fclose(write);
break;
}
else{
fputs(in,write);
}
}
}
}
- #P3# <блочная цитата> #P4# блочная цитата>
- #P5# <блочная цитата> #P6# блочная цитата>
Теперь это демонстрационный код, и максимальный размер, который может содержать o
, здесь равен 500
, однако в моем реальном коде он может быть 10,000
или даже 100,000
(все еще очень в пределах размера 32-битного int, не Это?)
Так что же решит эту наилучшую проблему с наименьшими изменениями?
Скомпилировано на Clang (может быть очень похоже на GCC) с -Wall -Wextra -pedantic
.
intptr_t o; = p-in;
— это синтаксическая ошибка, так насколько это потенциально далеко от реального кода? - person Ry-♦   schedule 12.09.2020Ctrl
-C
иCtrl
-V
В реальном коде переменные объявляются над этими операторами, так что это не проблема! (здесь поправил, спасибо) - person user13863346   schedule 12.09.2020*p = 0;
и просто использовать%s
? - person Retired Ninja   schedule 12.09.2020fputs
, если хотите. - person Retired Ninja   schedule 12.09.2020