Ошибка: несовместимые типы в присвоении 'const char [5]' для 'char [10]' - PullRequest
5 голосов
/ 24 марта 2011

Я определил c как

char c[][10]

в определении функции и использовал его как c[i]="gray";

Что не так?Я искал в сети, он показывает тот же синтаксис.

Спасибо.

Ответы [ 4 ]

10 голосов
/ 24 марта 2011

Вы не можете использовать присваивание (=) для массива. Если вы измените c на массив указателей, это может сработать, в зависимости от того, что вам нужно с ним делать.

const char *c[20];
c[i] = "gray";

Или, если объявленный тип должен быть массивом массивов, вы можете использовать strncpy:

char c[20][10];
strncpy(c[i], "gray", sizeof(c[i]));
10 голосов
/ 24 марта 2011

Проблема заключается в том, что массивы нельзя назначать в C. Строковые константы, такие как "gray", являются константами символьного массива: в этом случае тип равен char[5] (4 + 1 для завершающего нуля).

Если вы знаете, что целевой массив достаточно велик, чтобы вместить желаемую строку, вы можете использовать strcpy, чтобы скопировать строку следующим образом:

// Make sure you know that c[i] is big enough!
strcpy(c[i], "gray");

Лучшей идеей являетсяиспользуйте более безопасную функцию, такую ​​как strlcpy (для систем на базе BSD и Mac OS X) или strcpy_s (для Windows):

strlcpy(c[i], "gray", 10);  // 10 is the size of c[i]

Однако,Эти функции зависят от платформы и не всегда переносимы.Вы также можете свернуть свою собственную реализацию, если скорость не является проблемой:

size_t strlcpy(char *dst, const char *src, size_t size)
{
    size_t len = 0;
    while(size > 1 && *src)
    {
        *dst++ = *src++;
        size--;
        len++;
    }
    if(size > 0)
        *dst = 0;
    return len + strlen(src);    
}

Делайте Не используйте strncpy, так как потенциально может оставить вас ненулевымстрока

1 голос
/ 24 марта 2011

Попробуйте использовать strcpy() (находится в заголовке cstring) вместо простого назначения.

0 голосов
/ 17 января 2013

этот код будет работать и выполнять правильные назначения тремя различными способами:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    string myString = "hello my friends from Brazil";
    char charOut[myString.size()];
    strncpy(charOut, myString.c_str(), myString.size());
    std::cout << "Char by strncpy string var  " << charOut << std::endl;

    const char *charOut2;
    charOut2 = "sup my homies in L.A.";
    std::cout << "Char by const  " << charOut2 << std::endl;

    string myString2 = "hallo mein bruder in Berlin";
    char charOut3[myString2.size()];
    strcpy(charOut3, myString2.c_str());
    std::cout << "Char by strcpy string var  " << charOut3 << std::endl;
}

работает нормально на серверах Ubuntu.не тестировал на других системах.

...