2012-04-09 32 views
9

Tôi đã viết đoạn mã sau .... Nó nên chuyển đổi một chuỗi như "88" giá trị tăng gấp đôi 88 và in nóchuyển đổi chuỗi cho một biến đôi trong C

void convertType(char* value) 
{ 
    int i = 0; 
    char ch; 
    double ret = 0; 
    while((ch = value[i])!= '\0') 
    { 
     ret = ret*10 +(ch - '0'); 
     ++i; 
    } 
    printf("%d",ret);//or %f..what is the control string for double? 
} 



//input string :88 

Nhưng nó luôn luôn in 0. ..Nhưng khi tôi thay đổi loại ret để int ... nó hoạt động tốt ... khi loại là nổi hoặc đôi, nó in số không ... vậy tại sao tôi nhận được kết quả này mơ hồ?

+1

Không có những điều như một String trong C ;-) – Aidanc

+3

' "% f"' hoặc ' "% g'"(hoặc' "% e" 'cho định dạng hàm mũ) được sử dụng cho cả '(float)' và '(double)'. – geekosaur

+0

chỉ cần quên đi tiêu đề .. :) –

Trả lời

17

Sử dụng sscanf (header stdio.h hay cstdio trong C++):

char str[] = "12345.56"; 
double d; 

sscanf(str, "%lf", &d); 

printf("%lf", d); 
+1

là tệp tiêu đề/ –

+0

'stdio.h' hoặc' cstdio' cho C++. – Hauleth

+1

Tôi không đồng ý rằng đây là câu trả lời hay. Nó không giải quyết vấn đề, và không có gì sai với vòng lặp OPs để phân tích cú pháp một chuỗi thành gấp đôi. – abelenky

2

Bạn có thể có thể sử dụng atof() nó trả về một đôi.

source

+7

Làm cho nó 'strtod' và tôi có thể upvote. –

+0

tôi đã thử atof và strtod() .. Cả hai bản in 0 ... chỉ hoạt động khi loại ret thay đổi thành int –

+0

@Jinu nó không phải là vấn đề với atof hoặc strtod. Kiểm tra câu trả lời của tôi –

3

Nhưng nó luôn luôn in 0 ... Nhưng khi tôi thay đổi loại ret để int ... nó hoạt động tốt ... khi loại là float hay double, nó in zero.

Logic là tốt. Chỉ định dạng thông số của bạn là sai. Thay đổi nó thành %f và tất cả đều tốt!

-2

Mã sau hoạt động cho tôi.

#include <stdio.h> 

void convertType(char* value); 

int main(int argc, char *argv[]) { 
    char *str="0929"; 
    convertType(str); 

    return 0; 
} 

void convertType(char* value) { 
    double ret = 0; 

    while(*value != '\0') { 
     ret = ret*10 +(*value - '0'); 
     value++; 
    } 

    fprintf(stdout, "value: %f\n", ret); 
} 
+0

Đây không phải là chính xác để đưa ra một câu trả lời tốt cho đầu vào '-.00314159E + 003', phải không? –

-1
#define ZERO 48 
#define NINE 57 
#define MINUS 45 
#define DECPNT 46 

long strtolng_n(char* str, int n) 
{ 
    int sign = 1; 
    int place = 1; 
    long ret = 0; 

    int i; 
    for (i = n-1; i >= 0; i--, place *= 10) 
    { 
     int c = str[i]; 
     switch (c) 
     { 
      case MINUS: 
       if (i == 0) sign = -1; 
       else return -1; 
       break; 
      default: 
       if (c >= ZERO && c <= NINE) ret += (c - ZERO) * place; 
       else return -1; 
     } 
    } 

    return sign * ret; 
} 

double _double_fraction(char* str, int n) 
{ 
    double place = 0.1; 
    double ret = 0.0; 

    int i; 
    for (i = 0; i < n; i++, place /= 10) 
    { 
     int c = str[i]; 
     ret += (c - ZERO) * place; 
    } 
    return ret; 
} 
double strtodbl(char* str) 
{ 
    int n = 0; 
    int sign = 1; 
    int d = -1; 
    long ret = 0; 

    char* temp = str; 
    while (*temp != '\0') 
    { 
     switch (*temp) 
     { 
      case MINUS: 
       if (n == 0) sign = -1; 
       else return -1; 
       break; 
      case DECPNT: 
       if (d == -1) d = n; 
       else return -1; 
       break; 
      default: 
       if (*temp < ZERO && *temp > NINE) return -1; 
     } 
     n++; 
     temp++; 
    } 

    if (d == -1) 
    { 
     return (double)(strtolng_n(str, n)); 
    } 
    else if (d == 0) 
    { 
     return _double_fraction((str+d+1), (n-d-1)); 
    } 
    else if (sign == -1 && d == 1) 
    { 
     return (-1)*_double_fraction((str+d+1), (n-d-1)); 
    } 
    else if (sign == -1) 
    { 
     ret = strtolng_n(str+1, d-1); 
     return (-1) * (ret + _double_fraction((str+d+1), (n-d-1))); 
    } 
    else 
    { 
     ret = strtolng_n(str, d); 
     return ret + _double_fraction((str+d+1), (n-d-1)); 
    } 
} 
1

Bạn nên sử dụng chức năng "atof" nếu bạn muốn phân tích một char * tăng gấp đôi.

Bạn cũng nên sử dụng dấu phân cách "% f" để in các đôi:

biết thêm thông tin và ví dụ về sử dụng có thể tìm thấy here.

Ví dụ về sử dụng:

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

int main() 
{ 
    float val; 
    char str[20]; 

    strcpy(str, "98993489"); 
    val = atof(str); 
    printf("String value = %s, Float value = %f\n", str, val); 

    strcpy(str, "tutorialspoint.com"); 
    val = atof(str); 
    printf("String value = %s, Float value = %f\n", str, val); 

    return(0); 
} 

Để in bạn phải in nó dưới dạng phao:

printf("This is the value in float: %f\n", yourFloatValue); 
+0

Tuy nhiên, hàm 'atof' [dường như không đáng tin cậy trong một số trường hợp] (http://stackoverflow.com/a/7021778/975097). –

0

chuyển đổi chuỗi cho một biến đôi trong C

Nếu tràn không phải là một mối quan tâm, nhưng đang muốn phát hiện thêm văn bản không phải trắng-không gian sau khi văn bản số:

// return 1 on success 
int convertType(const char* value, double *destination) { 
    char sentinel; 
    return sscanf(value,"%f %c", destination, &sentinel) == 1; 
} 

Nếu sscanf() thất bại trong việc tìm một double, giá trị trả về của sscanf() sẽ được EOF hoặc 0.

Nếu sscanf() tìm thấy văn bản không phải trắng-không gian sau khi numer văn bản ic, nó sẽ trả lại 2.

Nếu chỉ có một double được quét, mà không cần thêm, sscanf() trả về 1. Hàng đầu và cuối khoảng trắng là OK.

Ví dụ:

double x; 
if (convertType(some_string, &x)) { 
    printf("%.17e\n", x); // or whatever FP format you like 
} else { 
    puts("Failed"); 
} 
Các vấn đề liên quan