请完成函数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...
c直接atoi...
#2
好长啊,新手我没耐心看下去,说说我的想法
定义一个新的字符串ret
for( 指针it = 字符串的开头it!=结尾;++it)
{
if(is数字)
ret += (*it);
}
后面再根据一些特殊的情况修改一下就差不多了
定义一个新的字符串ret
for( 指针it = 字符串的开头it!=结尾;++it)
{
if(is数字)
ret += (*it);
}
后面再根据一些特殊的情况修改一下就差不多了
#3
sscanf好像可以转换
#4
题目规定不能用atoi
#5
考虑考虑,,
#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
C++ String Toolkit (StrTk) Tokenizer
http://www.codeproject.com/Articles/23198/C-String-Toolkit-StrTk-Tokenizer
#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...
c直接atoi...
#2
好长啊,新手我没耐心看下去,说说我的想法
定义一个新的字符串ret
for( 指针it = 字符串的开头it!=结尾;++it)
{
if(is数字)
ret += (*it);
}
后面再根据一些特殊的情况修改一下就差不多了
定义一个新的字符串ret
for( 指针it = 字符串的开头it!=结尾;++it)
{
if(is数字)
ret += (*it);
}
后面再根据一些特殊的情况修改一下就差不多了
#3
sscanf好像可以转换
#4
题目规定不能用atoi
#5
考虑考虑,,
#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
C++ String Toolkit (StrTk) Tokenizer
http://www.codeproject.com/Articles/23198/C-String-Toolkit-StrTk-Tokenizer
#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;
}