Предупреждение: "присваивание отбрасывает квалификатор const из целевого типа указателя"

Я сделал свой собственный strtod() функция.

Я могу printf в консоли, но выдает следующее предупреждение:

myStrTod.c | 29 | предупреждение: "присваивание отбрасывает спецификатор const из целевого типа указателя"|


#include<stdio.h>
float myStrTod(const char * nPtr, char ** endPtr);
int rakamMi(int c);

int main()
{
    float d;
    const char *string = "51.2% kabul edildi";
    char *stringPtr;

    d = myStrTod(string,&stringPtr);
    printf("%.3f %s\n",d,stringPtr);
    return 0;
}

float myStrTod(const char * nPtr, char ** endPtr)
{
    char s1[20],s2[50];
    int i,j,k = 0,pnt,y = 1,num1 = 0,num2= 0;
    float f1,f2;
    for(i = 0; nPtr[i]; i++){
        if(rakamMi(nPtr[i]) || nPtr[i] == '.')
            s1[i] = nPtr[i];
        else break;
    }
    j = i;
    for(; nPtr[i]; i++)
       endPtr[i - j] = nPtr + i;

    for(i = 0; s1[i]; i++)
        if(s1[i] == '.'){
            pnt = i;
            break;
        }

    for (i = 0; s1[i]; i++)
    {
        if(i < pnt) num1 = num1 * 10 + (s1[i] - 48);
        else if (i == pnt) continue;
        else{
            num2 = num2 * 10 + (s1[i] - 48);
            ++k;
        }
    }
    for(i = 1; i <= k; i++)
        y = y * 10;

    f1 = num2 / (float) y;
    f2 = num1 + f1;
   // endPtr = s2;
    return f2;
}

int rakamMi(int c)
{
    if(c >= 48 && c <= 57)
        return 1;
    else
        return 0;
}

2 ответа

Вы пытаетесь присвоить значение типа pointer-to-const-char переменной типа pointer-to-char. Вы можете изменить подпись myStrTod так что вы выводите указатель на const char:

float myStrTod(const char *nPtr, const char **endPtr);

Тогда GCC сообщит о другой ошибке:

40937624.c: In function ‘main’:
40937624.c:11:25: warning: passing argument 2 of ‘myStrTod’ from incompatible pointer type [-Wincompatible-pointer-types]
     d = myStrTod(string,&stringPtr);
                         ^
40937624.c:2:7: note: expected ‘const char **’ but argument is of type ‘char **’

Это можно исправить, объявив stringPtr как указатель на const:

const char *stringPtr;

Поскольку вы никогда не пишете на содержание *stringPtrтогда этого достаточно.

Программа дала результат, но после этого program.exe перестала работать!

Причина этого заключается в следующем:

    j = i;
    for(; nPtr[i]; i++)
       endPtr[i - j] = nPtr + i;

Вы передаете адрес только одного char *stringPtr к функции, но используйте параметр endPtr как будто там был массив char *тем самым перезаписывая память за хранилище stringPtr, Измените все вышеперечисленное на:

    *endPtr = nPtr + i;
Другие вопросы по тегам