Нужно записать в строковую константу, как мне обойти это? - PullRequest
0 голосов
/ 26 января 2010

У меня есть следующий код:

int main() {
    char *sPPhrase[51];

    /* Input */
    printf("Enter string (max. 50 chars):\n");
    fflush(stdout);                         /* Works around an annoying Eclipse bug that fails to display the output from the printf command */
    scanf("%s", *sPPhrase);   /* Won't work */

    /* More code goes here */
}

Команда scanf() завершается неудачно, я полагаю, потому что * sPPhrase недоступен для записи, поскольку sPPhrase указывает на строковую константу. Компилятор понятия не имеет, что что-то не так. Чуть позже мне нужно передать эту строку этой функции:

char* reverse(char* sPPhrase[]);

Строковая константа недоступна для записи, но мне нужно передать этот символ * этой функции. Как мне переписать мой код, чтобы он работал?

Ответы [ 3 ]

6 голосов
/ 26 января 2010

Вы объявляете массив указателей, а не массив символов (обычно используется как строка).

Вы должны объявить так:

char sPPhase[51];

Кроме того, sscanf может доставить вам неприятности: лучше использовать fgets для чтения строки в ограниченном буфере:

int main() {
    char sPPhrase[51];
    printf("Enter string (max. 50 chars):\n");
    fflush(stdout);
    fgets(sPPhrase, 50, stdin);  // leave one byte for '\0'

    // More code
}

Я не знаю, что делает «реверс», но вы, вероятно, должны определить это как:

char* reverse(char* sPPhrase);

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

0 голосов
/ 26 января 2010

Чтобы понять это, вам нужно вернуться к тому, как массивы реализованы в памяти. char* sPPhrase[51]; - это объявление указателя на указатели, который вы можете считать похожим на двумерный массив. Если вы объявляете это и вызываете scanf для чтения, вы устанавливаете значение всего массива равным одному символу. Это все равно что сказать:

char chars2D[50][50];
chars2D[0] = 'A';

То, что это делает, устанавливает весь массив равным 'A', так что адрес памяти массива 'A'. Это значение мусора в памяти. Когда вы вызываете scanf("%s", *sPPhrase);, вы просто умножаете проблему, пытаясь установить вершину каждого массива равной букве. Таким образом, вы получите мусор.

Здесь - это поток, описывающий, как использовать scanf для чтения в массив символов.

0 голосов
/ 26 января 2010

Ваш упадок sPPhase:

char *sPPhrase[51];

На самом деле это массив из 51 указателя. То, что вы действительно хотите, это просто массив символов:

char sPPhrase[51];

Когда вы это сделаете, вы должны изменить scanf

scanf("%s",sPPhrase)

Также обратите внимание, что ваш scanf может читать больше, чем вы ожидаете.

...