Ошибка strcmp [c ++]: недопустимое преобразование из char в const char * [-fpermissive]

Где я ошибаюсь в этом коде? Мне нужны только char типы, пожалуйста, не предлагайте использовать std::string.

#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
    char *mystring="C:/windows";
    char last_char;
    last_char = mystring[strlen(mystring)-1];
    cout<<"Input: " <<mystring<<endl;
    if(strcmp(last_char,";")!=0)
    {
        strcat(mystring,";");
    }
    cout<<"Output: "<<mystring<<endl;
    return 0;
}

Вывод:

    Compilation error    time: 0 memory: 3340 signal:0
prog.cpp: In function ‘int main()’:
prog.cpp:7:17: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
  char *mystring="C:/windows";
                 ^
prog.cpp:11:25: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
  if(strcmp(last_char,";")!=0)
                         ^
In file included from prog.cpp:2:0:
/usr/include/string.h:140:12: error:   initializing argument 1 of ‘int strcmp(const char*, const char*)’ [-fpermissive]
 extern int strcmp (const char *__s1, const char *__s2)

person user2754070    schedule 25.12.2013    source источник
comment
Тип last_char - char, strcmp требует char * в качестве параметра. Используйте if(last_char == ';')   -  person tenos    schedule 25.12.2013


Ответы (2)


Не используйте strcmp, он ожидает последовательность символов с завершающим нулем. Вместо этого используйте прямое сравнение:

if (last_char == ';') ...

Кроме того, ваш код вызывает неопределенное поведение в вызове strcat(). my_string был инициализирован строковым литералом, поэтому вам не разрешено изменять его, поскольку реализация может поместить его в постоянную память (и обычно так и поступает).

Вместо этого вы можете объявить это так:

char mystring[12] = "C:/windows"; // space for one more char
person Filipe Gonçalves    schedule 25.12.2013
comment
ошибка: ISO C ++ запрещает сравнение между указателем и целым числом [-fpermissive] - person user2754070; 25.12.2013
comment
Вы уверены, что вставили ; в одинарные кавычки вместо двойных? - person Filipe Gonçalves; 25.12.2013
comment
Извините, моя ошибка - я сделал это сейчас, она выдала еще одну ошибку - Время ошибки выполнения: 0 память: 3340 сигнал: 11 Ввод: C: / windows Код вставлен здесь: ideone.com/yb6ZiF - person user2754070; 25.12.2013
comment
@ user2754070 Пожалуйста, прочтите мой обновленный ответ. Вы не можете использовать strcat с mystring, потому что он попытается изменить mystring, что недопустимо. - person Filipe Gonçalves; 25.12.2013
comment
@ user2754070 Какая часть my_string была инициализирована строковым литералом, поэтому вам не разрешено ее изменять, вы не получите? - person P0W; 25.12.2013
comment
Понятно, Филипе, каков максимальный диапазон массива символов? Потому что мне нужно держать Path Env variable of System (Windows). - person user2754070; 25.12.2013
comment
Ну, поскольку это локальный массив, это зависит от размера стека процесса. Я бы сказал, что вы можете безопасно хранить переменную среды path, я думаю, она недостаточно велика, чтобы вы могли об этом беспокоиться. - person Filipe Gonçalves; 25.12.2013

last_char не является строкой. Это персонаж. Невозможно сравнить char со строкой.
Попробуйте это вместо этого

 if (last_char == ';') {...}  

Заявление

 strcat(mystring,";");

вызывает неопределенное поведение. Вы не можете изменить строковый литерал, поскольку он находится в разделе памяти только для чтения.

person haccks    schedule 25.12.2013
comment
Гм. Ошибка, о которой вы упомянули, не совсем потому, что он пытается изменить строковый литерал, а потому, что вызов strcmp(), как есть, пытается преобразовать char (last_char) в const char *, чтобы передать его strcmp(). Это несовместимые типы, отсюда и ошибка. - person Filipe Gonçalves; 25.12.2013