开天辟地的卷毛 2022-05-14 00:14 采纳率: 85.4%
浏览 40
已结题

c语言关于使用strtol()的问题


/* 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,但是不懂为什么要将后面的字符也打印出来

  • 写回答

1条回答 默认 最新

  • a5156520 2022-05-14 11:07
    关注

    下面是我的理解,供参考:
    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)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月5日
  • 已采纳回答 6月27日
  • 创建了问题 5月14日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么