Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1348474
  • 博文数量: 118
  • 博客积分: 3888
  • 博客等级: 中校
  • 技术积分: 2940
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-10 18:15
个人简介

一看二做三总结

文章分类

全部博文(118)

分类: C/C++

2007-04-26 16:19:55

    在c/c++中int、float、char等都可以自由转换,但是由于c/c++语言本身根本就没有提供字符串数据类型,因此字符串与其他数据类型的转换就必须通过其提供的库函数来实现,通过对网上相关文章的总结和MSDN的查阅,现总结数值型数据与字符串型数据的转换实现过程如下:
(程序来源:MSDN)
 
一、sscanf与sprintf (stdio.h)
 

Example
/* SSCANF.C: This program uses sscanf to read data items
 * from a string named tokenstring, then displays them.
 */

#include <stdio.h>

void main( void )
{
   char tokenstring[] = "15 12 14...";
   char s[81];
   char c;
   int i;
   float fp;

   /* Input various data from tokenstring: */
   sscanf( tokenstring, "%s", s );
   sscanf( tokenstring, "%c", &c );
   sscanf( tokenstring, "%d", &i );
   sscanf( tokenstring, "%f", &fp );

   /* Output the data read */
   printf( "String = %s\n", s );
   printf( "Character = %c\n", c );
   printf( "Integer: = %d\n", i );
   printf( "Real: = %f\n", fp );
}

Output:

String = 15
Character = 1
Integer: = 15
Real: = 15.000000

sscanf的注意事项:

   1、把原字符串转换为另一个字符串时,只会把以原字符串的第一个连续字符串读取出来,空格与回车后的字符会被节掉

   2、转换为数值时,必须以数字开头

Example
/* SPRINTF.C: This program uses sprintf to format various
 * data and place them in the string named buffer.
 */

#include <stdio.h>

void main( void )
{
   char buffer[200], s[] = "computer", c = 'l';
   int i = 35, j;
   float fp = 1.7320534f;

   /* Format and print various data: */
   j = sprintf( buffer, "\tString: %s\n", s );
   j += sprintf( buffer + j, "\tCharacter: %c\n", c );
   j += sprintf( buffer + j, "\tInteger: %d\n", i );
   j += sprintf( buffer + j, "\tReal: %f\n", fp );

   printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}

Output:
   String: computer
   Character: l
   Integer: 35
   Real: 1.732053

character count = 71

 

二、atoi atof atol (stdlib.h)

double atof( const char *string );
int atoi( const char *string );
__int64 _atoi64( const char *string );
long atol( const char *string );

 

三、_itoa _ltoa 整形数据转换

从value转化到string,radix为数值的进制

char *_itoa( int value, char *string, int radix );
char *_ltoa( long value, char *string, int radix );

 

四、_ecvt _fcvt _gcvt

// Converts a double number to a string
char *_ecvt( double value, int count, int *dec, int *sign );


// Converts a floating-point number to a string
char *_fcvt( double value, int count, int *dec, int *sign );


// Converts a floating-point value to a string, which it stores in a buffer
char *_gcvt( double value, int digits, char *buffer );

    前两个函数功能与用法相似,只是一个转换单精度一个是转换双精度,但第三个函数与它们的区别很大:

  1、_ecvt与_fcvt的第二个参数count,表示有效数字的个数,与_gcvt的第二个参数digits一样。_ecvt与_fcvt的第三个参数dec表示小数点后的位数,第四个参数sign表示数值的正负,0表示正,1表示负。

  2、_ecvt与_fcvt把浮点数转化为字符串后是没有正负符号与小数点的,它们会被存入后边的两个参数:dec、sign。而且它们会自动分配字符串的分配空间,也就是说只要调用了这两个函数,它们就自己分配空间来存储字符串,然后返回字符串的指针。

  3、_gcvt函数也许更为常用。它需要用户自己分配一个缓冲区buffer来存储转换后的变量。这点与sprintf和atof等函数是一致的。还需要注意,它们没必要返回,也就是说没必要把它的返回值赋给其他变量。

  4、_gcvt函数最方便的是它转换后的字符串是保有原数值的符号位与小数点的,也就是说忠实的反映了原数值,能够方便的显示出来。这是与_ecvt、_fcvt的最大区别

 

/* _GCVT.C: This program converts -3.1415e5
 * to its string representation.
 */

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

void main( void )
{
   char buffer[50];
   double source = -3.1415;
   _gcvt( source, 3, buffer );
   printf( "source: %f buffer: '%s'\n", source, buffer );
}

Output

source: -3.141500 buffer: '-3.14'

阅读(5897) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~