Я написал приведенный ниже код, но продолжаю получать «Команда завершена сигналом 11».

#include<stdio.h>
    
int main() 
{
    char *goodnight_message[20];
    printf ("Enter the goodnight message.\n");
    scanf ("%s", &goodnight_message);
    printf ("%s Buddy.\n", *goodnight_message);
    return 0;
}
c
-1
Ndaru John 4 Июл 2021 в 12:42

4 ответа

Лучший ответ

Похоже, у вас неправильное представление о массивах и указателях .. При использовании типа массива goodnight_message[20]; Правильный способ адресовать его адрес - использовать &goodnight_message[0], указывающий на начало массива, или просто использовать goodnight_message. Оба они указывают на 0-й индекс массива.

#include<stdio.h>
    
int main() 
{
    char *goodnight_message[20];
    printf ("Enter the goodnight message.\n");
    scanf ("%s", goodnight_message);
    printf ("%s Buddy.\n", goodnight_message);
    return 0;
}

Совет: вы должны использовать gets(goodnight_message) вместо scanf, когда вам нужна строка, содержащая пробел. Вы также можете сделать это с помощью scanf("%[^\n]s",goodnight_message);, например:

#include<stdio.h>

int main() 
{
    char *goodnight_message[20];
    printf ("Enter the goodnight message.\n");
    scanf ("%[^\n]s", goodnight_message);
    printf ("%s Buddy.\n", goodnight_message);
    return 0;
}
-1
Dada 4 Июл 2021 в 15:29

Я подозреваю, что вам нужен один char массив из 20 char, а не массив из 20 char*, который у вас есть сейчас.

Обратите внимание, что при передаче массивов функциям, таким как scanf и printf, они превращаются в указатели на первый элемент. Также обратите внимание, что при использовании scanf для чтения строк всегда устанавливайте максимальное количество символов для чтения (на один меньше размера массива, чтобы оставить место для нулевого терминатора). В противном случае пользователь может ввести больше символов, и ваша программа будет записывать за допустимые пределы.

Вы также должны всегда проверять, является ли scanf успешным, проверяя, возвращает ли он такое же количество конверсий, которое вы запросили. Вы запрашиваете только один, поэтому проверьте, возвращает ли он 1.

Тогда рабочая программа будет выглядеть так:

#include <stdio.h>
    
int main()  {
    char goodnight_message[20];                   // now a char[] instead

    printf("Enter the goodnight message.\n");

    if(scanf("%19s", goodnight_message) == 1) {   // decays into a char*
        printf("%s Buddy.\n", goodnight_message); // decays into a char*
    }
}

Однако это не будет читать больше одного слова. Чтобы scanf читался до новой строки, вы можете добавить набор символов, соответствующих спецификатору преобразования, с помощью [ characters ].

  • Если первый символ в наборе - ^, то совпадают все символы не в наборе.

Нам нужны все символы, кроме \n, поэтому давайте добавим набор [^\n]

#include <stdio.h>

int main() {
    char goodnight_message[20];

    // an alternative to printf when you don't need formatting is puts:
    puts("Enter the goodnight message.");

    if(scanf("%19[^\n]", goodnight_message) == 1) {
        printf("%s Buddy.\n", goodnight_message);
    }
}
2
Ted Lyngmo 4 Июл 2021 в 19:46

Строка char *goodnight_message[20]; создает массив строк (массив указателей на символы)

Для создания одной строки используйте char *goodnight_message; или char goodnight_message[20];

Предупреждение: если вы используете char *goodnight_message;, вы должны malloc его, так что пока просто придерживайтесь [20]


scanf ("%s" читает одну строку из ввода, но учтите, что это только следующий пробел
например, ввод good night будет только читать good, а вывод good buddy
чтобы прочитать всю строку, используйте gets(goodnight_message) или getline

Предупреждение: getline немного сложно (объяснение)

-1
Superior 4 Июл 2021 в 09:56

Это также может выполнить задачу -

#include <stdio.h>
int main() {

    char goodnight_message[20];
    printf ("Enter the goodnight message.\n");
    scanf ("%s", &goodnight_message);
    printf ("%s Buddy.\n", goodnight_message);
    
    
    return 0;
}
-1
sam2611 4 Июл 2021 в 10:04