Разница между * ул и атой (ул) - PullRequest
0 голосов
/ 10 августа 2011

Я использовал токены и использовал strtok для текстового файла (который был считан в массив 'store') с разделителем '='

поэтому в файле было утверждение: TCP.port = 180

И я сделал:

str = strtok(store, "=");

str= strtok(NULL, "=");

Теперь, если я сделаю *str, это даст мне '82' (вероятно, какое-то нежелательное значение) но atoi(str); дает мне 180 (правильное значение)

Я надеялся, что кто-то может пролить свет на это, разве разыменование str тоже не даст мне 180?

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

Скомпилируйте и запустите эту программу.Это должно дать вам лучшее представление о том, что происходит.

#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'
2 голосов
/ 10 августа 2011

Нет. atoi дает вам целое число, представленное строкой, на которую указывает str. Разыменование str (* str) дает вам значение char str, на которое указывает (не то, что вы написали).

1 голос
/ 10 августа 2011

Вам нужно понять, как именно работают строки в C, чтобы увидеть, что здесь происходит. Переменная str является указателем на первый символ в строке. Разыменование str дает значение, на которое указывает str, а именно символ '1'. Аналогично, разыменование str+1 даст вам следующий символ, '8'. Вы можете видеть, как конец строки обозначается *(str+3) (или, что эквивалентно, str[3]), что дает нулевой байт. Функция atoi знает, как интерпретировать символы как строку из 10 символов ASCII, что намного сложнее, чем разыменование.

...