How To Convert String To Double In C

Programmers frequently get into scenarios where they must convert a string to a double data type when dealing with decimal values. This is especially true for programs used in scientific research, financial computations, and GPS monitoring systems.

There are a number of built-in functions in the C programming language that may be used for this purpose, but choosing the best one might take a lot of work for novices.

It is crucial to accurately and quickly convert a string to a double since even little mistakes can result in severe output inaccuracies.

Why Convert String to Double In C

Here are the reasons to perform this conversion task:

  • To perform mathematical operations or tasks that require decimal values, strings must be converted to double data types
  • Conversion of string to double is a common operation in programming and must be executed precisely and efficiently
  • Converting strings to doubles is crucial for applications.
  • Conversion of a string representing a monetary value to a double is necessary for computations in financial applications.
  • Converted value can be used in arithmetic operations, comparisons to other double values, and mathematical procedures requiring decimal values
  • Accurate conversion is crucial for decimal data since even a slight inaccuracy can lead to significant errors in output

Various Approaches Of Converting String to Double in C

  • Using the strtod()
  • Using the sscanf()
  • Using the atof()

Using the strtod() Method

The function to convert a string to a double is a component of the common C library. The string that has to be converted and a reference to a character that marks the transformed string’s end are its two required inputs.

Code:-

#include <stdio.h>
#include <stdlib.h>

int main() {
  char str1[] = "3.14159";
  char str2[] = "2.71828";
  char str3[] = "6.02214";
  char *endptr1, *endptr2, *endptr3;
  double num1, num2, num3;

  num1 = strtod(str1, &endptr1);
  num2 = strtod(str2, &endptr2);
  num3 = strtod(str3, &endptr3);

  if (*endptr1 != '\0' || *endptr2 != '\0' || *endptr3 != '\0') {
     printf("Invalid input.\n");
  } else {
     printf("The converted numbers are: %lf, %lf, %lf\n", num1, num2, num3);
  }

  return 0;
}

Output:-

The converted numbers are: 3.141590, 2.718280, 6.022140

Explanation:

  • strtod() function is called three times, each time converting a string to a double value, and storing the converted value in num1, num2, and num3, respectively.
  • The second argument of the strtod() function, endptr1, endptr2, and endptr3, is a pointer to a character, and will be assigned the address of the first character in the input string that is not part of the converted number.
  • The program then checks if all three input strings have been fully converted to double values by checking if the value pointed to by each endptr is the null character ‘\0’.
  • If any input string has not been fully converted, the program prints an error message.
  • Otherwise, the program prints the converted values of num1, num2, and num3 using printf() function.

Using the sscanf() Method

The standard C library includes this function, which is used to read input from a string. By giving a string as an argument and specifying with the %lf format specifier that the input should be read as a double, it may be used to convert a string to a double.

Code:-

#include <stdio.h>

int main() {
   char str[20] = "12.345";
   double num;

   // Using sscanf()
   sscanf(str, "%lf", &num);
  
   // Printing the result
   printf("The converted double is: %lf\n", num);

   // Another example with a negative number
   char str3[20] = "-6.789";
   double num3;

   // Using sscanf()
   sscanf(str3, "%lf", &num3);

   // Printing the result
   printf("The converted double is: %lf\n", num3);

   return 0;
}

Output:-

The converted double is: 12.345000
The converted double is: -6.789000

Explanation:

  • The sscanf() function is used to convert the string to a double value, and the converted value is stored in the num variable.
  • The format specifier “%lf” is used with the sscanf() function to indicate that the input string is a double value.
  • The program also provides one more example with a negative decimal value.

Using the atof() Method

This function, which is a part of the common C library, is used to convert a string to a double. It accepts a string as a parameter and outputs the double value after conversion.

Code:-

#include <stdio.h>
#include <stdlib.h>

int main() {
   char str[20] = "8.92";
   double num;

   // Using atof()
   num = atof(str);
  
   // Printing the result
   printf("The converted double is: %lf\n", num);

   // Another example with a negative number
   char str3[20] = "-10.43";
   double num3;

   // Using atof()
   num3 = atof(str3);

   // Printing the result
   printf("The converted double is: %lf\n", num3);

   return 0;
}

Output:-

The converted double is: 8.920000
The converted double is: -10.430000

Explanation:

  • The atof() function is used to convert the string to a double value, and the converted value is stored in the num variable.
  • The program also provides one more example with a negative decimal value.
  • The same process is followed for these examples to convert the strings to double values and print the converted values. Finally, the program returns 0 to indicate successful execution.

Best Approach:

Based on the analysis, the strtod() function is the best approach. Here are the reasons why:

  • Accuracy: strtod() function returns highly precise results that are correct. It is more flexible than atof() and sscanf() since it can handle scientific notation, plus and minus signs, decimal points, and other unusual characters.
  • Strtod() provides superior error-handling capabilities compared to atof() and sscanf() for any conversion failures since it gives you the finished location of the processed text.
  • Strtod() is more portable than atof() and sscanf() in terms of portability. sscanf() is not as extensively supported across platforms
  • Performance: Strtod() is a highly quick function that can easily handle long strings, even if it may be slower than atof() and sscanf().

Sample Problems:

1. You are developing a GPS tracking system that receives location data in the form of latitude and longitude coordinates as a string. How can you convert these values to double data types to perform further calculations and analysis?

Solution:

  • The radius of the Earth is defined as a constant R with a value of 6371.0 km using the #define preprocessor directive.
  • The main() function is defined and the required variables are declared: lat_str and lon_str to store the latitude and longitude values as strings entered by the user, lat1, lon1, lat2, lon2 to store the converted latitude and longitude values as doubles, dlat, dlon, a, c, and d to store the intermediate and final calculation values.
  • The user is prompted to enter the latitude and longitude coordinates of the first point and the input values are read using scanf() function and stored in lat_str and lon_str.
  • The strtod() function is used to convert the latitude and longitude strings to double values, which are stored in lat1 and lon1.
  • The user is then prompted to enter the latitude and longitude coordinates of the second point and the input values are read and stored in lat_str and lon_str.
  • The strtod() function is used again to convert the latitude and longitude strings to double values, which are stored in lat2 and lon2.
  • The latitude and longitude differences are calculated in radians and stored in dlat and dlon.
  • The Haversine formula is then used to calculate the distance between the two points. The formula involves multiple calculations:
  • The first step involves calculating the value of a using the Haversine formula.
  • Next, the value of c is calculated using the atan2() function, which takes the square root of a and 1-a as its arguments.
  • Finally, the distance between the two points is calculated using d = R * c, where R is the radius of the Earth.
  • The calculated distance value is then displayed on the screen using printf() function.

Code:-

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define R 6371.0 // radius of Earth in km

int main()
{
  char lat_str[30], lon_str[30];
  double lat1, lon1, lat2, lon2, dlat, dlon, a, c, d;
 
  printf("Enter latitude 1: ");
  scanf("%s", lat_str);
 
  printf("Enter longitude 1: ");
  scanf("%s", lon_str);
 
  lat1 = strtod(lat_str, NULL);
  lon1 = strtod(lon_str, NULL);
 
  printf("Enter latitude 2: ");
  scanf("%s", lat_str);
 
  printf("Enter longitude 2: ");
  scanf("%s", lon_str);
 
  lat2 = strtod(lat_str, NULL);
  lon2 = strtod(lon_str, NULL);
 
  dlat = (lat2 - lat1) * M_PI / 180.0;
  dlon = (lon2 - lon1) * M_PI / 180.0;
 
  a = pow(sin(dlat / 2), 2) + cos(lat1 * M_PI / 180.0) * cos(lat2 * M_PI / 180.0) * pow(sin(dlon / 2), 2);
c = 2 * atan2(sqrt(a), sqrt(1 - a));
d = R * c;

printf("The distance between the two points is %lf km.\n", d);

return 0;
}

Output:-

Enter latitude 1: 51.5074
Enter longitude 1: -0.1278
Enter latitude 2: 40.7128
Enter longitude 2: -74.0060
The distance between the two points is 5576.947141 km.

2. You are developing a financial application that needs to calculate the compound interest on an investment. How can you convert a string representing the investment amount to a double data type for performing arithmetic operations?

Solution:

  • Get input from the user for the investment amount, annual interest rate, and number of years using fgets and sscanf.
  • Store the input values in an Investment object.
  • Calculate the total interest using the compound_interest function.
  • Print the investment amount, annual interest rate, number of years, total interest, and total value (principal + total interest) to the console.

Code:-

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define NUM_YEARS 5

// Define Investment struct
typedef struct Investment {
   double principal;
   double interest_rate;
   int years;
} Investment;

// Define function to calculate compound interest
double compound_interest(double principal, double interest_rate, int years) {
   double amount = principal * pow((1 + (interest_rate / 100)), years);
   return amount - principal;
}

int main() {
   // Declare variables
   char input_str[50];
   double principal;
   int years;
   double interest_rate;
   double total_interest;
  
   // Create Investment object
   Investment investment;
  
   // Get input from user
   printf("Enter the investment amount: ");
   fgets(input_str, 50, stdin);
   sscanf(input_str, "%lf", &principal);
   investment.principal = principal;
  
   printf("Enter the annual interest rate: ");
   fgets(input_str, 50, stdin);
   sscanf(input_str, "%lf", &interest_rate);
   investment.interest_rate = interest_rate;
  
   printf("Enter the number of years: ");
   fgets(input_str, 50, stdin);
   sscanf(input_str, "%d", &years);
   investment.years = years;
  
   // Calculate total interest
   total_interest = compound_interest(investment.principal, investment.interest_rate, investment.years);
  
   // Print output
   printf("Investment: $%.2lf\n", investment.principal);
   printf("Annual Interest Rate: %.2lf%%\n", investment.interest_rate);
   printf("Years: %d\n", investment.years);
   printf("Total Interest: $%.2lf\n", total_interest);
   printf("Total Value: $%.2lf\n", investment.principal + total_interest);
  
   return 0;
}

Output:-

Enter the investment amount: 1000
Enter the annual interest rate: 5.5
Enter the number of years: 10
Investment: $1000.00
Annual Interest Rate: 5.50%
Years: 10
Total Interest: $682.62
Total Value: $1682.62

3. You are developing an application that takes user input in the form of a string and needs to perform arithmetic operations on the input. How can you convert the input string to a double data type for performing calculations?

Solution:

  • Prompt the user to enter a number and store it in the input_string variable using the scanf() function.
  • Use the atof() function to convert the input_string to a double and store it in the input_double variable.
  • Perform the arithmetic operation on the input_double variable and store the result in the result variable.

Code:-

#include <stdio.h>
#include <stdlib.h>

int main() {
 char input_string[100];
 double input_double, result;

 // Get user input as a string
 printf("Enter a number: ");
 scanf("%s", input_string);

 // Convert string to double using atof() function
 input_double = atof(input_string);

 // Perform arithmetic operation on the double value
 result = input_double * 2;

 // Print the result
 printf("The result of doubling %lf is %lf\n", input_double, result);

 return 0;
}

Output:-

Enter a number: 3.5
The result of doubling 3.500000 is 7.000000

Conclusion:

A typical task in C programming is to convert a string to a double data type, and various built-in functions can achieve this. The strtod() is the favoured approach owing to its improved error handling.

For the development of several applications that require decimal values, such as financial and scientific applications, as well as GPS tracking systems, it is essential to understand how to convert strings to doubles.