C-не распечатывать всю строку целиком.


int main()
{
    //Define Variables

    char studentName;

    //Print instructions to fill the data in the screen
    printf("Please type in the Students name:n");
    scanf("%s", &studentName);
    printf("nn%s", &studentName);

    return 0;
}

Видя приведенный выше код, я печатаю только для того, чтобы отсеять первое слово при вводе предложения.

Я знаю, что это основная вещь, но я только начинаю с простого С.

6 2

6 ответов:

Прочитайтеscanf(3) документацию. Для %s, что

   s      Matches a sequence of non-white-space characters; the next
          pointer must be a pointer to character array that is long
          enough to hold the input sequence and the terminating null
          byte ('\0'), which is added automatically.  The input string
          stops at white space or at the maximum field width, whichever
          occurs first.

Таким образом, ваш код неверен, потому что он должен иметь массив для studentName, т. е.

char studentName[32];
scanf("%s", studentName);

, что все еще опасно из-за возможного переполнения буфера (например, если вы вводите имя из 32 или более букв). Использование %32s вместо %s может быть безопаснее.

Возьмите также привычку компилировать со всеми включенными предупреждениями и с отладочной информацией (т. е. при использовании GCC с gcc -Wall -g). Некоторые компиляторы могли бы вас предупредить. Научитесь использовать отладчик (например, gdb).

Кроме того, возьмите за привычку заканчивать - не начинать-свою строку формата printf с \n (или же вызовите fflush, см. fflush(3)).

Узнайте онеопределенном поведении . В вашей программе были такие! И он пропускает директиву #include <stdio.h> (как первую не комментирующую значимую строку).

Кстати, чтение существующего свободного программного кода на языке Си также многому вас научит.

Существует три проблемы с вашим кодом:

  • вы записываете строку в блок памяти, выделенный для одного символа; это неопределенное поведение
  • вы печатаете строку из блока памяти, выделенного для одного символа - также неопределенное поведение
  • вы используете scanf для чтения строки с пробелами; %s останавливается на первом пробеле или символе конца строки.

Одним из способов исправить это было бы использование fgets, например:

char studentName[100];

//Print instructions to fill the data in the screen
printf("Please type in the Students name:\n");
fgets(studentName, 100, stdin);
printf("\n\n%s", &studentName);

return 0;

Попробуйте scanf ("%[^\n]", &studentName); вместо scanf ("%s", &studentName);

Это происходит потому, что %s перестает считывать входные данные, как только появляется пробел.

Чтобы избежать этого, вы можете объявить массив длины, необходимой для вашей строки.

Затем используйте эту команду для ввода строки: -

scanf("%[^\n]s",arr);

Таким образом, scanf будет продолжать читать символы, если не встретится '\n', другими словами, вы нажмете клавишу enter на клавиатуре. Это дает новый линейный сигнал, и вход останавливается.

int main()
{
    //Define Variables

    char studentName[50];

    //Print instructions to fill the data in the screen
    printf("Please type in the Students name:\n");
    scanf("%[^\n]s", &studentName);
    printf("\n\n%s", &studentName);

    return 0;
}

Альтернативно вы также можно использовать методы get () и puts (). Это действительно облегчит вашу работу, если вы пишете код для очень простой задачи.

[EDIT]: как указалdasblinkenlight ...Я также не рекомендую вам использовать функцию gets, так как она была устаревшей.

int main()
    {
        //Define Variables

        char studentName[50];

        //Print instructions to fill the data in the screen
        printf("Please type in the Students name:\n");
        gets(studentName); printf("\n\n");
        puts(studentName);

        return 0;
    }

Внесите изменения ниже и попробуйте. Я добавил [80] после определения studentName, чтобы сообщить компилятору, что studentName-это массив из 80 символов (в противном случае компилятор будет рассматривать его как только один символ). Кроме того, символ & перед именем studentName не является обязательным, поскольку имя массива неявно подразумевает указатель.

int main()
{
  //Define Variables

  char studentName[80];

  //Print instructions to fill the data in the screen
  printf("Please type in the Students name:\n");
  scanf("%s", studentName);
  printf("\n\n%s", studentName);

  return 0;

}

Ваша проблема здесь

char studentName;

Это символ, а не строка.

Попробуйте:

  1. определите его как массив символов типа char studenName[SIZE];.
  2. выделение памяти динамически с помощью malloc:

.

char buffer[MAX_SIZE];
scanf("%s", &buffer);
char * studentName = malloc (sizeof(buffer) + 1);
strcpy (studentName , buffer);