【问题标题】:Difference between *str and atoi(str)*str 和 atoi(str) 的区别
【发布时间】:2011-08-09 23:06:11
【问题描述】:

我正在标记化,并在带有分隔符“=”的文本文件(已读入数组“存储”)上使用 strtok

所以文件中有一条语句:TCP.port = 180

我做到了:

str = strtok(store, "=");

str= strtok(NULL, "=");

现在如果我做*str,它会给我'82'(可能是一些垃圾值) 但是atoi(str); 给了我 180(正确的值)

我希望有人能阐明这一点,不应该取消引用 str 给我 180 吗?

【问题讨论】:

  • 你不应该使用 strtok。使用 strtok_r 确保线程安全。
  • 你能把整段代码粘贴到发生这种情况的地方吗?
  • 82 是字符 'R' 的 ASCII 表示。你确定那是你得到的吗?如果 atoi(str) 给你 180,*str 应该给你 49,'1' 的 ASCII 表示。
  • Keith 感谢您将这一点曝光..我确实得到了 49

标签: c tokenize strtok


【解决方案1】:

编译并运行这个程序。它应该能让您更好地了解正在发生的事情。

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    const char *s = "180";
    printf("s       = \"%s\"\n", s);
    printf("atoi(s) = %d\n", atoi(s));
    printf("*s      = %d = '%c'\n", *s, *s);
    return 0;
}

这是输出:

s       = "180"
atoi(s) = 180
*s      = 49 = '1'

【讨论】:

  • 好的,知道了。你介意告诉我什么 const char *s = "180";方法?我们是让 s 指向内存位置 #180 还是别的什么?
  • @Siddhartha:不,完全不是那样的。 "180" 是一个字符串文字,指定一个字符数组,其值为{ '1', '8', '0', '\0' }(最后一个'\0' 是一个空字符,表示字符串的结尾)。 s 是一个指针,它被初始化为指向该字符串的开头。可以看到第一个printf 调用打印出字符串“180”。
  • 非常感谢。非常有帮助。我认为如果我们说 const char *s = 180 (或有效的内存位置),那将意味着位置 #180(尽管很可能它会给出编译器不匹配错误)
  • @Siddhartha:正确的做法是const char *s = (const char*)180;——尽管这不太可能是个好主意。没有从 int 到任何指针类型的隐式转换(除了 0 的特殊情况,它是一个空指针常量)。
【解决方案2】:

没有。 atoi 为您提供由 str 指向的字符串表示的整数。取消引用 str (*str) 会为您提供 str 指向的字符的值(这不是您写入的值)。

【讨论】:

    【解决方案3】:

    您需要准确了解字符串在 C 中是如何工作的,才能了解这里发生了什么。 str 变量是指向字符串中第一个字符的指针。解引用str 得到str 指向的值,即字符'1'。类似地,取消引用str+1 会给你下一个字符'8'。您可以看到字符串的结尾是如何用*(str+3)(或等价的str[3])表示的,它给出了一个空字节。 atoi 函数知道如何将字符解释为 ASCII 字符的 base-10 字符串,这比取消引用要复杂得多。

    【讨论】:

    • 非常感谢,如果我有声望的话,我会投票给你的:D
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2019-04-27
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多