不使用库函数将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]

我的老师给我们布置了一个任务,我们创建一个函数来读取ASCII数字字符并将其转换为数字,而不使用任何库函数,如
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
函数的行为来看,它似乎类似于:

  • 如果输入字符串中的第一个字符不是,则返回NULL

  • 如果输入字符串中的第一个字符是数字,则将所有前导数字转换为存储在
    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;
    }