【问题标题】:strtok and int vs char in CC中的strtok和int vs char
【发布时间】:2014-09-12 13:10:50
【问题描述】:

我正在学习如何划分字符数组,我需要执行一个操作,将数字和字符串拆分为不同的变量并打印出来。我相信我已经很接近了,但是当打印出我的号码时,我得到了疯狂的数字。这是int的地址吗?任何意见是极大的赞赏!我的代码和输入/输出:

    #include <stdio.h>

    int main() {
        setbuf(stdout, NULL);
        char name[10];
        printf("Enter in this format, integer:name\n");
        fgets(name, 10, stdin);                            //my input was 2:brandon
        char *n = strtok(name, ":");
        int num = (int)n;
        char * order = strtok(NULL, ":");
        printf("%d,%s", num,order);                        //my output was 7846332,brandon
        return (0);
    }

【问题讨论】:

    标签: c pointers casting strtok


    【解决方案1】:

    此行不正确:

    int num = (int)n;
    

    这是 int 的地址吗?

    不,它是存储整数字符表示的位置的字符缓冲区的地址,重新解释为int(即它可能是一个截断的地址,使它几乎是一个毫无意义的数字)。

    您可以通过解析值或使用 atoi 将其转换为 int:

    int num = atoi(n);
    

    Demo.

    【讨论】:

    • 一般来说strtol()atoi() 更好,因为strtol 更灵活,而atoi 在错误报告方面很蹩脚。
    • @John Hascall 同意 strtol() 优于 atoi(),因为它具有良好的错误处理潜力。但这可能涉及errno = 0; char *endptr; long tmp = strtol(n, &amp;endptr, 10); if (endptr == n) Handle_NoConversion(); if (errno || tmp &lt; INT_MIN || tmp &gt; INT_MAX) Handle_Overflow(); n = (int) tmp;
    【解决方案2】:

    如果你给例如"123:foobar" 作为输入,指针n 指向字符串 "123"。将指针转换为整数时,整数的值是变量n 的值,即strtok 返回的字符串在内存中的位置。

    如果要将包含数字的字符串转换为实际数字,则应使用例如strtol 函数:

    int num = strtol(n, NULL, 10);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多