转换“a”的逻辑;char";变成一个;int";在C中

转换“a”的逻辑;char";变成一个;int";在C中,c,char,int,logic,atoi,C,Char,Int,Logic,Atoi,各位! 请帮助我理解以下问题。。。 所以我将有一个字符串类型的音符输入,看起来像“A5”或“G#2”或“Cb4”等,我需要提取一个倍频程索引,它是最后一个数字“5”或“2”或“4”。。。在交换之后,我需要它作为int类型 所以我这样做了: string note = get_string("Input: "); int octave = atoi(note[strlen(note) - 1]); printf("your octave is %i \n", octave); 但它给了我一个错误

各位!

请帮助我理解以下问题。。。 所以我将有一个字符串类型的音符输入,看起来像“A5”或“G#2”或“Cb4”等,我需要提取一个倍频程索引,它是最后一个数字“5”或“2”或“4”。。。在交换之后,我需要它作为int类型

所以我这样做了:

string note = get_string("Input: ");
int octave = atoi(note[strlen(note) - 1]);
printf("your octave is %i \n", octave);
但它给了我一个错误“错误:不兼容的整数到指针转换将'char'传递给'const char*'类型的参数;使用&[-Werror,-Wint conversion]获取地址”

然后我试着从函数中推导出数学公式,并这样做:

int extnum = strlen(note) - 1;
int octave = atoi(note[extnum]);
但效果不太好。所以我研究了atoi函数,但我不明白

  • ATOI需要一个字符串(检查)
  • 将其转换为整数,而不是ASCII值(检查)
  • atoi函数库(检查)
  • 我所做的基本上是问“取该字符串的第n个字符,使其成为int”

    在谷歌搜索了一段时间后,a发现了另一个代码示例,其中一个人使用带有符号“&”的atoi所以我做了这个

    int octave = atoi(&note[strlen(note) - 1]);
    
    成功了!但我不明白为什么它和符号一起工作,没有符号就不能工作……因为它总是在没有符号的情况下工作!有一百万次我给了一个像“5”这样的字符串,我只是用了atoi,它工作得很好


    请帮助我,为什么在这种情况下它的行为如此奇怪?

    函数
    atoi
    将指向字符数组的指针作为输入参数(
    const char*
    )。调用
    note[strlen(note)-1]
    时,这是一个字符(
    char
    ),为了使
    atoi
    工作,您需要提供指针。您可以通过添加
    &
    来完成此操作。这就行了,因为就在这一个数字之后,有一个空字符
    \0
    终止了字符串-因为原始字符串是以空结尾的

    但是请注意,这样做不是一个好主意:

    char a = '7';
    int b = atoi(&a);
    

    由于无法确定内存中的下一个字节是什么(在属于
    a
    的字节之后),但函数仍将尝试读取它,这可能导致未定义的行为

    最后一个字符是。。。一个角色!不是一串。因此,通过添加
    &
    符号,您使其成为指向字符(
    char*
    )的指针

    您也可以尝试以下代码:

    char a = '5';
    int b = a - '0';
    

    为您提供
    5
    的ASCII代码减去
    0的ASCII代码C没有本机字符串类型。字符串通常表示为字符数组或指向字符的指针

    假设
    string
    只是
    char*
    的一个typedef

    如果
    note
    是字符数组,
    note[strlen(note)-1]
    只是最后一个字符。由于
    atoi
    需要指向char的指针(必须以null结尾),因此必须传递char的地址,而不是值

    将一个字符数字转换为int的任务也可以更容易地解决:

    int octave = note[strlen(note) - 1] - '0';
    
    从中,
    atoi
    的签名是:
    intatoi(constchar*nptr)。因此,您需要传递
    char
    的地址

    执行此操作时:
    atoi(注意[strlen(注意)-1])
    传递
    char
    本身。因此,调用


    当您使用
    &
    时,您传递的是函数所期望的地址。因此,这是可行的。

    atoi
    除了一个字符串(指向字符的指针),而不是一个字符

    但是,您不应该使用atoi,因为该函数的错误处理能力很差。该功能100%等效,但更安全

    您需要分两步执行此操作:

  • 查找字符串中的第一个数字
  • 从那里,通过调用
    strtol
    将其转换为整数
  • 1) 可以通过循环字符串来解决can问题,通过调用ctype.h中的
    isdigit
    检查每个项目是否为数字。同时,检查字符串的结尾,即空终止符
    \0
    。找到第一个数字后,保存指向该地址的指针


    2) 通过将保存的指针传递到
    strtol
    ,例如
    result=strtol(指针,NULL,10),可以解决此问题

    C没有本机
    字符串
    类型。那么什么是字符串呢?
    '5'
    不是“字符串”
    “5”
    是一个“字符串”。所以magic
    &
    不仅仅是一些随机符号,它是运算符的C地址,它给你一个指向某个东西的指针。C语言中的字符串经常使用指向字符的指针进行操作。因此,为了理解这里发生的事情,你必须学习更多关于C语言中字符串和指针的知识。你还需要考虑字符和字符串之间的区别:一个字符是一个单个字符,而一个字符串是由零个或多个字符组成的数组。具体来说,
    note
    note+strlen(note)-1
    可以说是一个“字符串”(用某种说法)<代码>注释[strlen(note)-1]
    是单个
    char