Получение предупреждения о приведении «от указателя к целому числу разного размера» при компиляции c в gcc - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь выучить C и пытаюсь преобразовать char в int, чтобы извлечь значение ASCII. Однако, когда я пытаюсь скомпилировать это в GCC, я получаю это предупреждение:

warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
     ascii = (int) letter;

Я пытаюсь создать простую программу, которая запрашивает один символ, сканирует его, а затем приводит его к типу int, чтобы получить значение ASCII, распечатывая это значение. Я инициализировал переменную letter как char* и ascii как int. Я пытался использовать заполнители %s, %c и %1s для переменной letter, но это не работает.

Вот код:

#include <stdio.h>

char* letter;
int ascii;

int main(){
    printf("Please input a charcter:");
    scanf("%s", letter);
    ascii = (int) letter;
    printf("\n The ASCII value of %s is %d.\n", letter, ascii);
}

Я ожидал бы, что "Please input a character:" напечатает, затем будет напечатан символ, такой как a, и затем будет напечатано, например, `'Значение ASCII для a равно 97 . "

Вместо этого, когда я что-то печатаю, он печатает "The ASCII value of (null) is zero." Во время компиляции он печатает ошибку, указанную выше. Это не то, что должно было случиться.

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Вы не приводите char к int, вы указываете указатель на char на int.

int main(){
    // define as an actual char, not a char*
    char letter;
    int ascii;

    printf("Please input a character:");
    // scan a character, not a string.  Pass in the address of the char
    scanf("%c", &letter);
    ascii = (int)letter;
    printf("\n The ASCII value of %c is %d.\n", letter, ascii);
}
0 голосов
/ 14 мая 2019
#include <stdio.h>

//char* letter; //moving to stack from data segment
int ascii;

int main(){
    char letter[10] = {0};//allocing 10 bytes here, all initialized null chars
    printf("Please input a charcter:");
    scanf("%c", &letter); //not checking return value here, bad form
    ascii = (int) letter[0]; //casting only the first char
    printf("\n The ASCII value of %s is %d.\n", &letter, ascii);
}

В результате вы получите желаемый результат:

Please input a charcter:
 The ASCII value of a is 97.

Это плохой код, и я прокомментировал некоторые строки, чтобы добавить ясности.

#include <stdio.h>

//char* letter; //moving to stack from data segment
int ascii;

int main(){
    char letter[10] = {0};//allocing 10 bytes here, all initialized null chars
    printf("Please input a charcter:");
    scanf("%s", &letter); //not checking return value here, bad form
    ascii = (int) letter[0]; //casting only the first char
    printf("\n The ASCII value of %s is %d.\n", &letter, ascii);
    printf("\n The ASCII value of %s is %d.\n", &letter[1], (int)letter[1]);
}

При вводе ab изменение% c на% s приводит к получению обоих символов (что в первую очередь похоже на то, что вы хотели?)

Please input a charcter:
 The ASCII value of ab is 97.


 The ASCII value of b is 98

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...