我正在尝试创建一个程序,该程序本质上接受用户输入并将其乘以 12 并输出该数字。尽管我遇到了下面的问题,但我已经把它记下来了。
expected output :
./test
minutes: 0000004
bottles: 48
actual output :
$ ./test
minutes: 0000004
minutes: minutes: bottles: 48
我想解决这个问题,而不必将 分钟Str[4] 更改为更大的数字。我的一个想法是更改缓冲区来存储该值,删除前导 0,并将其从缓冲区中取出。我还在研究中发现 scanf 可以解决前导 0 问题,但我想在不使用 scanf 的情况下做到这一点,因为它是“坏的”。我也只是想学习。
// Set buffer size to 0 to fix printf/fgets problem
setvbuf(stdout, 0, _IONBF, 0);
char minutesStr[4]; // This limits minutes to < 999
char *end;
int minutes = 0;
int i = 0;
int offset;
do
{
printf("minutes: ");
// Takes in user input string, sizeof(string), from keyboard
fgets(minutesStr, sizeof(minutesStr), stdin);
while (minutesStr[i] == '0')
{
i++;
}
if (minutesStr[i] == '\n')
for ( offset = 0; offset < i; offset++ )
{
minutesStr[offset] = minutesStr[offset + i];
}
// returms size of string up to \n and replaces it with null terminator
minutesStr[strlen(minutesStr) - 1] = '\0';
// minutes = (Convert the string into a long)
minutes = strtol (minutesStr, &end, 10);
}
while ( minutes < 1 );
printf("bottles: %d\n", (minutes * 12));
return 0;
这也是我的第一个问题,所以如果我做错了什么,请告诉我。
最佳答案
试试这个
char minutesStr[4]; // This limits minutes to < 999
int minutes = 0;
int i = 0;
do {
printf("minutes: ");
do{
fgets(minutesStr, sizeof(minutesStr), stdin);
for(i = 0; minutesStr[i] == '0'; ++i)
;
} while(i == sizeof(minutesStr) -1);
if(i != 0 && !strchr(minutesStr, '\n')){
int len = sizeof(minutesStr) - i -1;
memmove(minutesStr, minutesStr + i, len);
fgets(minutesStr + len, sizeof(minutesStr) - len, stdin);
}
minutes = strtol (minutesStr, NULL, 10);
} while ( minutes < 1);
printf("bottles: %d\n", (minutes * 12));
关于c - 如何确保 fgets 准确接受带前导 0 的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37181356/