पूर्णांक कैसे प्राप्त करें और बिना `scanf()` सी के बिना इनपुट फ़्लोट करें?




floating-point int (2)

मैं कैसे scanf() का उपयोग किए बिना एक चर या सरणी के लिए उपयोगकर्ता द्वारा दिए गए एक पूर्णांक और फ़्लोट मान को असाइन कर सकता हूँ?

जैसा कि हमारे पास fgetc , fgetc , fgets ... आदि fgetc और string , क्या फ़्लोट्स और पूर्णांक के लिए कोई फ़ंक्शन है?


क्या फ़्लोट्स और इंटिजर्स के लिए कोई फ़ंक्शन है?

हाँ, यह scanf() , फिर भी ओपी उस का उपयोग नहीं करना चाहता है

कैसे scanf() बिना पूर्णांक और फ्लोट इनपुट प्राप्त करने के लिए?

यह scanf("%d", &some_int) , scanf("%f", &some_float) तरह करने के लिए एक तुच्छ कार्य नहीं है।

सबसे लंबे समय तक मान्य इनपुट का उपयोग करने के बाद सबसे ज्यादा प्राथमिक समस्या यह है कि वह पढ़ना बंद कर दें - यह उपयोगकर्ता इनपुट की एक पंक्ति के बीच में हो सकता है। मुझे एक संक्षिप्त समाधान नहीं मिला।

इसके बजाय, एक पूर्णांक के लिए उपयोगकर्ता इनपुट की एक पंक्ति को पढ़ने की समस्या को लंबा लगाया। एक float पढ़ना समान है *** लाइनों के पास आवश्यक परिवर्तन

फिर भी परिमित टेक्स्ट की लंबाई की समस्या होती है। नीचे दिए गए कोड मानते हैं कि long छपाई करने के लिए अधिकतम इनपुट अधिकतम 2x long

अतिप्रवाह एक मुद्दा है जो यहां कुछ हद तक संबोधित किया गया है। scanf() साथ याद करें, ऑफ़ / यूएफ अपरिभाषित व्यवहार है

केन्द्रीय विचार यह है कि रिक्त स्थान को छोड़कर, एन अक्षर पढ़ते हुए और उसके बाद किसी भी गैर-सफेद स्थान की खोज करके एक रेखा को पढ़ना है। फिर बफर पार्स करें

#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// character array size needed to represent all `long`
#define INT_STR_SIZE (sizeof(long)*CHAR_BIT/3 + 3)
#define INT_BUF_SIZE (INT_STR_SIZE*2)

int readline_long(long *dest) {                        // ***
  int ch;
  while (isspace(ch = getchar()) && ch != '\n') {
    ;
  }
  if (ch == EOF) return EOF;
  ungetc(ch, stdin);

  char buf[INT_BUF_SIZE];                                 // ***
  if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;
  if (strchr(buf, '\n') == NULL) {
    // Get rest of line
    bool only_white_space = true;
    while ((ch = getchar()) != '\n' && ch != EOF) {
      if (!isspace(ch)) only_white_space = false; // consume rest of line
    }
    if (!only_white_space) return 0;  // extra junk
  }
  char *endptr;
  errno = 0;
  long y = strtol(buf, &endptr, 10);                    // ***
  if (buf == endptr) return false;  // no conversion
  while (isspace((unsigned char) *endptr)) {
    endptr++;
  }
  if (*endptr) return 0; // extra junk
  *dest = y;
  return 1;
}

टेस्ट कोड

int main(void) {
  long lg;
  int retval;
  while ((retval = readline_long(&lg)) != EOF) {
    printf("retval = %d", retval);
    if (retval > 0) printf(" val = %ld", lg);
    if (errno) printf(" errno = %d", errno);
    putchar('\n');
    fflush(stdout);
  }
}

पूर्णांक और फ़्लोट्स को पढ़ने के लिए फ़ंक्शन नहीं हैं, लेकिन आप strtof लिए strtof साथ और strtof लिए strtof उपयोग कर सकते हैं:

// floats:
char str_f[20];
float f;

fgets (str_f, 20, stdin);
f = strtof(str_f, NULL);

// integers:
char str_i[20];
int i;

fgets(str_i, 20, stdin);
i = strtol(str_i, NULL, 0);

तुम भी integers के लिए atoi उपयोग कर सकते हैं लेकिन यह सिफारिश नहीं है क्योंकि atoi त्रुटियों का पता नहीं है और यह अप्रचलित माना जाता है

यदि आप त्रुटियों का पता लगाने के लिए चाहते हैं तो आप निम्न कोड का उपयोग कर सकते हैं:

// floats:
char *endptr_f;
char str_f[20];
float f;

fgets (str_f, 20, stdin);
f = strtof(str_f, &endptr_f);

if (*endptr_f != '\n' || str_f[0] == '\n' || endptr_f == str_f)
{
    printf("ERROR: \"%s\" is an invalid float!\n", str_f);
}

// integers:
char *endptr_i;
char str_i[20];
int i;

fgets(str_i, 20, stdin);
i = strtol(str_i, &endptr_i, 0);

if (*endptr_i != '\n' || str_i[0] == '\n' || endptr_i == str_i)
{
    printf("ERROR: \"%s\" is an invalid integer!\n", str_i);
}





scanf