不使用库函数将Ascii转换为整数
我的老师给我们布置了一个任务,我们创建一个函数来读取ASCII数字字符并将其转换为数字,而不使用任何库函数,如不使用库函数将Ascii转换为整数,c,function,pointers,C,Function,Pointers,我的老师给我们布置了一个任务,我们创建一个函数来读取ASCII数字字符并将其转换为数字,而不使用任何库函数,如atoi。通过一些研究,我在自己的文件中得出了以下结论: #include <stdio.h> #include <sttdef.h> int main() { char testString[] = "123"; int convertedResult = 0; int i; for(i = 0; testString[i]
atoi
。通过一些研究,我在自己的文件中得出了以下结论:
#include <stdio.h>
#include <sttdef.h>
int main() {
char testString[] = "123";
int convertedResult = 0;
int i;
for(i = 0; testString[i] != '\0'; i++){
convertedResult = convertedResult*10 + testString[i] - '0';
printf("%i\n",convertedResult);
if (testString[i] == '\0') {
break;
}
}
return 0;
}
我有点困惑,怎么从这里开始?附件图片是主要的
#包括
#包括
char*asciiToInteger(char*inputString,int*integerPtr){
int convertedResult=0;
for(int i=0;inputString[i]!='\0';i++){
convertedResult=convertedResult*10+输入字符串[i]-“0”;
}
*integerPtr=convertedResult;
返回输入字符串;
}
int main(){
char testString[]=“123”;
整数型;
asciiToInteger(testString和integerPtr);
printf(“%d\n”,integerPtr);
返回0;
}
您的代码有几个问题:
- 它假定整个字符串是数字
- 它两次检查字符串的结尾
#include <stdio.h>
const char *asciiToInteger(const char *inputString, int *value)
{
int result = 0;
while (isdigit((unsigned int) *inputString))
{
result *= 10;
result += *inputString++ - '0';
}
*value = result;
return inputString;
}
#包括
常量字符*整数(常量字符*输入字符串,整数*值)
{
int结果=0;
while(isdigit((无符号整数)*输入字符串))
{
结果*=10;
结果+=*inputString++-'0';
}
*值=结果;
返回输入字符串;
}
这将返回指向第一个未转换字符的指针,如果字符串都是数字,则该指针可能指向字符串末尾标记。当然,我在字符串上添加了
const
,因为这个转换器只是从字符串中读取数据。当你得到这样的赋值时,第一步是确保你理解函数应该做什么。你的问题没有这样的描述,所以这是开始的地方
从main
函数的行为来看,它似乎类似于:
integerPtr
指向的对象中的整数,并返回指向转换后数字后面的字符的指针inputString = "a123b67" --> return NULL
inputString = "123b67" --> *integerPtr = 123 and return a pointer to the 'b' in the input
可能看起来像这样:
char *asciiToInteger(char *inputString, int *integerPtr) {
if (*inputString < '0' || *inputString > '9')
return NULL; // no leading digit
*integerPtr = 0;
do
{
*integerPtr = *integerPtr * 10 + *inputString - '0';
++inputString;
} while (*inputString >= '0' && *inputString <= '9');
return inputString;
}
char*asciiToInteger(char*inputString,int*integerPtr){
如果(*inputString<'0'| |*inputString>'9')
返回NULL;//无前导数字
*integerPtr=0;
做
{
*integerPtr=*integerPtr*10+*inputString-'0';
++输入字符串;
}当(*inputString>='0'&&&*inputString此函数必须位于主文件以外的文件中??或者您只需要添加一个函数?我对您老师函数的签名感到有点困惑。预期的输入和输出是什么?我的意思是,似乎很清楚,他们希望您将输入放在inputString
中,将输出放在中de>integerPtr
,但是为什么函数要返回一个char*
,而不是只返回一个int
并删除integerPtr
?函数确实需要位于main.im以外的另一个文件中,并且指针预期的输出也会丢失。不幸的是,我不能使用strtol()因为这是一个函数,我只能使用我的professor@FedericoklezCulloca我希望它返回一个指向第一个未转换字符的指针,这在很多方面都很常见(基本上这是strtol()的混合体)而且很有用。请不要将代码作为图像发布。代码是文本,请将其作为文本发布。虽然此代码片段可能会解决问题,但确实有助于提高您的文章质量。请记住,您将在将来为读者回答问题,而这些人可能不知道您建议代码的原因。
inputString = "a123b67" --> return NULL
inputString = "123b67" --> *integerPtr = 123 and return a pointer to the 'b' in the input
char *asciiToInteger(char *inputString, int *integerPtr) {
if (*inputString < '0' || *inputString > '9')
return NULL; // no leading digit
*integerPtr = 0;
do
{
*integerPtr = *integerPtr * 10 + *inputString - '0';
++inputString;
} while (*inputString >= '0' && *inputString <= '9');
return inputString;
}