/* strcnvt.c -- 使用strtol() */
#include<stdio.h>
#include<stdlib.h>
#include"s_gets.h"
#define LIM 30
int main()
{
char number[LIM];
char* end;
long value;
puts("Enter a number (empty line to quit):");
while (s_gets(number, LIM) && number[0] != '\0')
{
value = strtol(number, &end, 10); /* 十进制 */
printf("base 10 input, base 10 output: %ld stopped at %s (%d)\n", value, end, *end);
value = strtol(number, &end, 16); /* 十六进制 */
printf("base 16 input, base 16 output: %ld stooped at %s (%d)\n", value, end, *end);
puts("Next number:");
}
puts("Bye!\n");
return 0;
}
#include<stdio.h>
char* s_gets(char* st, int n)
{
char* ret_val;
int i = 0;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
while (st[i] != '\n' && st[i] != '\0')
i++;
if (st[i] == '\n')
st[i] = '\0';
else
while (getchar() != '\n')
continue;
}
return ret_val;
}
/* 输出结果 */
Enter a number (empty line to quit):
10atom
base 10 input, base 10 output: 10 stopped at atom (97)
base 16 input, base 16 output: 266 stooped at tom (116)
Next number:
Bye!
想问一下,为什么会打印出10 atom 97。266, tom 166
尤其是end用%d输出,我觉得是a和t,但是不懂为什么要将后面的字符也打印出来
下面是我的理解,供参考:
strtol函数把第一个参数指向的字符串转换为第三个参数指定的进制的数字输出,第二个参数是第一个参数的数字的下一个字符的指针的指针。
参考:C 库函数 – strtol() | 菜鸟教程
所以输入 10atom,即调用strol("10atom", &end, 10) ,把字符串“10atom”里的数字转换为10进制的数字就是 10,
然后指向数字的下一个字符a的指针,按%s打印即输出字符a位置到字符串结尾,即“atom”, %d打印(*end),即打印字符a,他的ASCII码是97,所以输出97。(如果按%c打印就是字符a)。
同理,调用strol("10atom", &end, 16) ,把字符串“10atom”里的数字(10a)转换为16进制的数字就是 266,
然后指向数字的下一个字符t的指针,按%s打印即输出字符位置到字符串结尾,即“tom”, %d打印(*end),即打印字符t,他的ASCII码是116,所以输出116。(如果按%c打印就是字符t)。