不使用库函数将ascii转换为整数

时间:2019-03-06 10:31:44

标签: 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] != '\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) {
     return inputString;
 }

我对如何从这里开始感到困惑?附带的图片为主

enter image description here

3 个答案:

答案 0 :(得分:1)

    #include <stdio.h>
    #include <stddef.h>  

    char * asciiToInteger(char *inputString, int *integerPtr){
           int convertedResult =0;

           for(int i = 0; inputString[i] != '\0'; i++){
            convertedResult = convertedResult*10 + inputString[i] - '0';

          }
          *integerPtr=convertedResult;


         return inputString;
         }

 int main() {  
    char testString[] = "123";
    int  integerPtr;
    asciiToInteger(testString, &integerPtr) ;
    printf("%d\n",integerPtr);

    return 0;
    }

答案 1 :(得分:1)

您的代码有两个问题:

  • 假定整个字符串都是数字
  • 它两次检查字符串的结尾

我认为更好的实现方法是:

#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;
}

这将返回指向第一个未转换字符的指针,如果字符串是全数字,则该指针可能会指向字符串标记的末尾。我当然在字符串上添加了const,因为此转换器只是从字符串中读取。

答案 2 :(得分:1)

当您获得这样的分配时,第一步是确保您了解该功能应该执行的操作。您的问题没有这样的描述,因此是开始的地方。

main函数的行为来看,它似乎是这样的:

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

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

请注意,上面的代码无法处理负整数。