我的老师给了我们一个作业,我们在其中创建一个函数,该函数可以读取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;
}
我对如何从这里开始感到困惑?附带的图片为主
答案 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
函数的行为来看,它似乎是这样的:
如果输入字符串中的第一个字符不是不是个数字,则返回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;
}
请注意,上面的代码无法处理负整数。