strcmp [c ++] ошибка: неверное преобразование из 'char' в 'const char *' [-fpermissive]

0

Где я ошибаюсь в этом коде? Мне нужно только в типах 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)
  • 0
    Тип last_char - char, strcmp требует char * в качестве параметра. Используйте if(last_char == ';')
Теги:
pointers
char
strcmp

2 ответа

5
Лучший ответ

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

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

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

Вместо этого вы можете объявить это следующим образом:

char mystring[12] = "C:/windows"; // space for one more char
  • 0
    ошибка: ISO C ++ запрещает сравнение между указателем и целым числом [-fpermissive]
  • 1
    Вы уверены, что вставили одинарные кавычки ; вместо двойных кавычек?
Показать ещё 5 комментариев
1

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

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

утверждение

 strcat(mystring,";");

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

  • 2
    Hum. Ошибка, о которой вы упоминали, не совсем потому, что он пытается изменить строковый литерал, а потому, что вызов strcmp() , как есть, пытается преобразовать char ( last_char ) в const char * чтобы передать его в strcmp() , Это несовместимые типы, поэтому ошибка.
  • 0
    @ FilipeGonçalves; Ты прав.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню