字符串转换成整数

时间:2023-01-03 19:11:06
输入一个表示整数的字符串,把该字符串转换成整数并输出,例如输入字符串"345",则输出整数345。
请完成函数StrToInt,实现字符串转换成整数的功能。
字符串转换成整数字符串转换成整数
庞果网上的题目,个人写了一程序,感觉符合要求,却未通过,新人求指点。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 100
typedef char DataType;

typedef struct
{
    DataType data[max];
    int front;
    int rear;
} Queue,*PQueue;

PQueue Init_Queue()
{
    PQueue Q;
    Q=(PQueue)malloc(sizeof(Queue));
    if(Q)
    {
        Q->front=0;
        Q->rear=0;
    }
    return Q;
}

int Empty_Queue(PQueue Q)
{
    if(Q&&Q->front==Q->rear)return 1;
    else return 0;
}

int In_Queue(PQueue Q,DataType x)
{
    if((Q->rear+1)%max==Q->front)
    {
        return -1;
    }
    else
    {
        Q->rear=(Q->rear+1)%max;
        Q->data[Q->rear]=x;
    }
    return 1;
}

int Out_Queue(PQueue Q,DataType *x)
{
    if(Empty_Queue(Q))
    {
        return -1;
    }
    else
    {
        Q->front=(Q->front+1)%max;
        *x=Q->data[Q->front];
        return 1;
    }
}

int Front_Queue(PQueue Q,DataType *x)
{
    if(Empty_Queue(Q))
        return -1;
    else
    {
        *x=Q->data[(Q->front+1)%max];
        return 1;
    }
}

int Destroy_Queue(PQueue *Q)
{
    if(*Q)
        free(*Q);
    *Q=NULL;
    return 1;

}

int Is_number(char c)
{
    if(c>='0'&&c<='9')return 1;
    else return 0;
}

int Is_char(char c)
{
    if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))return 1;
    else return 0;
}

int StrtoInt(char *str,char ch[])
{
    PQueue Q;
    int i=0;
    char e;
    Q=Init_Queue();
    while(str[i]!='\0')//将字符串入队,遇到字母结束入队操作;
    {
        if(Is_char(str[i]))//该字母是否为字符串首个元素,是输出0;
        {
            if(Empty_Queue(Q))
            {
                ch[0]='0';
                ch[1]='\0';
                return 1;
            }
            else In_Queue(Q,' ');
            break;
        }
        In_Queue(Q,str[i]);
        i++;
    }
    In_Queue(Q,' ');
    i=0;
    Out_Queue(Q,&e);
    while(e==' '||e=='0')//一直出队直到遇到第一个不为0或空格的数;
    {
    if(Empty_Queue(Q))//如果字符串中只有0或空格返回0值;
    {
        ch[0]='0';
        ch[1]='\0';
        return 1;
    }
    else Out_Queue(Q,&e);
    }
    while(!Empty_Queue(Q))
    {
        if(e=='-')//当“-”后为非数值时,返回0,否则保留“-”号
        {
            Out_Queue(Q,&e);
            if(e=='-'||e=='+'||e==' ')
            {
                ch[0]='0';
                ch[1]='\0';
                return 1;
            }
            else
            {
                ch[i]='-';
                ch[++i]=e;
            }
        }
        else if(e=='+')
        {
            Out_Queue(Q,&e);
            if(e=='-'||e=='+'||e==' ')
            {
                ch[0]='0';
                ch[1]='\0';
                return 1;
            }
            else
            {
                ch[0]=e;
            }
        }
        else
        {
            ch[i]=e;
            i++;
            Out_Queue(Q,&e);
        }
    }
    ch[i+1]='\0';
    return 1;
}
main()
{
    int i;
    char s[max],ch[max];
    gets(s);
    i=strcmp(s,"");//判断字符串是否为空;
    if(i)//为空输出0,否则进入转换;
    {
        StrtoInt(s,ch);
        printf("%s",ch);
    }
    else printf("0");
}

13 个解决方案

#1


字符串转换成整数 写的复杂了点吧..

c直接atoi...

#2


好长啊,新手我没耐心看下去,说说我的想法
定义一个新的字符串ret
for( 指针it = 字符串的开头it!=结尾;++it)
{
  if(is数字)
    ret += (*it);
}
后面再根据一些特殊的情况修改一下就差不多了
     

#3


sscanf好像可以转换

#4


题目规定不能用atoi 字符串转换成整数

#5


引用 2 楼 u010928856 的回复:
好长啊,新手我没耐心看下去,说说我的想法
定义一个新的字符串ret
for( 指针it = 字符串的开头it!=结尾;++it)
{
  if(is数字)
    ret += (*it);
}
后面再根据一些特殊的情况修改一下就差不多了
     
考虑考虑,,

#6


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

int StrToInt(const char* str)
{
    int length, sign, i, j;
    unsigned num = 0;
    while (*str) {
        if (isspace(*str))
            ++str;
        else
            break;
    }
    if ('\0' == *str)
        return 0;
    if (isdigit(*str))
        sign = 0;
    else if ('+' == *str)
        sign = 0, ++str;
    else if ('-' == *str)
        sign = 1, ++str;
    else
        return 0;
    length = strlen(str);
    if (0 == length)
        return 0;
    for (i = 0, j = 1; i < length - 1; ++i)
        j *= 10;
    for (i = 0; i < length; ++i, j /= 10) {
        if (!isdigit(str[i])) {
            num /= j * 10;
            break;
        }
        num += (str[i] - '0') * j;
    }
    if (sign) {
        if (num > 0x80000000u)
            num = 0x80000000u;
    } else {
        if (num > 0x7FFFFFFFu)
            num = 0x7FFFFFFFu;
    }
    return sign ? -1 * num : num;
}

通过了。

#7


参考“《编译原理》词法分析 有限状态自动机”

#8


写那么复杂干啥.例如对于"354",第一次取出char类型的3,把它转换成int型的3;类似的第二次得5;第三次得4;最后计算机(3*10+5)*10+4,问题就解决了,很简单的... 

#9


那你就将atoi的方法自己写出来 

#10


简单的实现atoi函数源代码:
#include <cctype>
int my_atoi(const char* p){
assert(p != NULL);
bool neg_flag = false;// 符号标记
int res = 0;// 结果
if(p[0] == '+' || p[0] == '-')
neg_flag = (*p++ != '+');
while(isdigit(*p)) res = res*10 + (*p++ - '0');
return neg_flag ?0 -res : res;
}

#12



int atoi1(char s[])
{
int i=0;
while (s[i]==' '||s[i]=='\t') i++;
if (s[i]!='+'&&s[i]!='-'&&(!(s[i]>='0'&&s[i]<='9'))) return 0;
int signFlag;
signFlag=((s[i]=='-')?-1:1);
if (s[i]=='+'||s[i]=='-') i++;
int v(0);
while (s[i]>='0'&&s[i]<='9'&&s[i]!='\0')
{
v=v*10+s[i]-'0';
i++;
}
return signFlag*v;
}

#13



int atoi1(char s[])
{
int i=0;
while (s[i]==' '||s[i]=='\t') i++;
if (s[i]!='+'&&s[i]!='-'&&(!(s[i]>='0'&&s[i]<='9'))) return 0;
int signFlag;
signFlag=((s[i]=='-')?-1:1);
if (s[i]=='+'||s[i]=='-') i++;
int v(0);
while (s[i]>='0'&&s[i]<='9'&&s[i]!='\0')
{
v=v*10+s[i]-'0';
i++;
}
return signFlag*v;
}

#1


字符串转换成整数 写的复杂了点吧..

c直接atoi...

#2


好长啊,新手我没耐心看下去,说说我的想法
定义一个新的字符串ret
for( 指针it = 字符串的开头it!=结尾;++it)
{
  if(is数字)
    ret += (*it);
}
后面再根据一些特殊的情况修改一下就差不多了
     

#3


sscanf好像可以转换

#4


题目规定不能用atoi 字符串转换成整数

#5


引用 2 楼 u010928856 的回复:
好长啊,新手我没耐心看下去,说说我的想法
定义一个新的字符串ret
for( 指针it = 字符串的开头it!=结尾;++it)
{
  if(is数字)
    ret += (*it);
}
后面再根据一些特殊的情况修改一下就差不多了
     
考虑考虑,,

#6


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

int StrToInt(const char* str)
{
    int length, sign, i, j;
    unsigned num = 0;
    while (*str) {
        if (isspace(*str))
            ++str;
        else
            break;
    }
    if ('\0' == *str)
        return 0;
    if (isdigit(*str))
        sign = 0;
    else if ('+' == *str)
        sign = 0, ++str;
    else if ('-' == *str)
        sign = 1, ++str;
    else
        return 0;
    length = strlen(str);
    if (0 == length)
        return 0;
    for (i = 0, j = 1; i < length - 1; ++i)
        j *= 10;
    for (i = 0; i < length; ++i, j /= 10) {
        if (!isdigit(str[i])) {
            num /= j * 10;
            break;
        }
        num += (str[i] - '0') * j;
    }
    if (sign) {
        if (num > 0x80000000u)
            num = 0x80000000u;
    } else {
        if (num > 0x7FFFFFFFu)
            num = 0x7FFFFFFFu;
    }
    return sign ? -1 * num : num;
}

通过了。

#7


参考“《编译原理》词法分析 有限状态自动机”

#8


写那么复杂干啥.例如对于"354",第一次取出char类型的3,把它转换成int型的3;类似的第二次得5;第三次得4;最后计算机(3*10+5)*10+4,问题就解决了,很简单的... 

#9


那你就将atoi的方法自己写出来 

#10


简单的实现atoi函数源代码:
#include <cctype>
int my_atoi(const char* p){
assert(p != NULL);
bool neg_flag = false;// 符号标记
int res = 0;// 结果
if(p[0] == '+' || p[0] == '-')
neg_flag = (*p++ != '+');
while(isdigit(*p)) res = res*10 + (*p++ - '0');
return neg_flag ?0 -res : res;
}

#11


#12



int atoi1(char s[])
{
int i=0;
while (s[i]==' '||s[i]=='\t') i++;
if (s[i]!='+'&&s[i]!='-'&&(!(s[i]>='0'&&s[i]<='9'))) return 0;
int signFlag;
signFlag=((s[i]=='-')?-1:1);
if (s[i]=='+'||s[i]=='-') i++;
int v(0);
while (s[i]>='0'&&s[i]<='9'&&s[i]!='\0')
{
v=v*10+s[i]-'0';
i++;
}
return signFlag*v;
}

#13



int atoi1(char s[])
{
int i=0;
while (s[i]==' '||s[i]=='\t') i++;
if (s[i]!='+'&&s[i]!='-'&&(!(s[i]>='0'&&s[i]<='9'))) return 0;
int signFlag;
signFlag=((s[i]=='-')?-1:1);
if (s[i]=='+'||s[i]=='-') i++;
int v(0);
while (s[i]>='0'&&s[i]<='9'&&s[i]!='\0')
{
v=v*10+s[i]-'0';
i++;
}
return signFlag*v;
}