LINUX.ORG.RU

Помогите с scanf в C

 ,


0

1

Привет,ЛОР!Тут решил Си изучить,стал пописывать хеллоуворды,но тут такая беда:scanf неадекватно себя ведет или я зеленый такой.

 #include <stdio.h>
 #define  SIZE_OF_NICKNAME 12       
  /*Есть и другой код,но я его закомментировал,когда обнаружил проблему с scanf.*/
   main () 
  {
    char nickname[SIZE_OF_NICKNAME];  //Имя персонажа
    printf("Введите имя : ");
    scanf("%12s",nickname);
  }
И выводит:
$ ./a.out
Введите имя : LorLorLorLorLorLor
Введите имя : Введите имя :
$./a.out
Введите имя : ЛорЛорЛорЛорЛор
user@debian:~$ 
Решение проблемы - Unicode

Deleted

Последнее исправление: cetjs2 (всего исправлений: 5)

ЕМНИП, у тебя может ещё \0 в строку не влезть.

theNamelessOne ★★★★★
()
Ответ на: комментарий от anonymous

Введет себя также неадекватно.

Deleted
()
Ответ на: комментарий от theNamelessOne

Амперсанд убери.

Знатоки языка не знают, что это альяс?

#include <stdio.h>
int main(void)
{
    char c[10];
    printf("address &c: %p\n", &c);
    printf("address  c: %p\n", c);
    return 0;
}
$ ./test 
address &c: 0x7ffc2667ae80
address  c: 0x7ffc2667ae80
andreyu ★★★★★
()
Ответ на: комментарий от Deleted

Может есть альтернативный вариант проверки переполнения массива?

Нет. Есть гнутый модификатор a, который сам выделяет место под строку.

Так же

А можно подробнее, в чём симптомы ошибки? К примеру, что ожидалось и что получили.

theNamelessOne ★★★★★
()
Ответ на: комментарий от anonymous

Ты весь код покажи.

#include <stdio.h>

int main(void) {
  char nickname[12];
  printf("Enter name: ");
  scanf("%11s", nickname);
  printf("You've entered: %s\n", nickname);
  return 0;
}

Можно nickname[11] = '\0'

Не понял, к чему это.

theNamelessOne ★★★★★
()
Ответ на: комментарий от anonymous

Сделал правку.Смотри в начале.

Deleted
()

Не используй scanf.

Deleted
()

У тебя массив на 12 байтов, а вводится 12 + 1 завершающий байт 0x00.

Deleted
()
Ответ на: комментарий от andreyu

Я хочу чтобы программа ввела себя адекватно,если юзер введет больше 12 символов.

На лоре принципиально сообщения выше не читают?

Deleted
()
Ответ на: комментарий от Deleted

На лоре принципиально сообщения выше не читают?

Выше находится ваше исправленное сообщение, которое я прочел и задал соответствующий вопрос.

Если говорить о «Я хочу чтобы программа ввела себя адекватно,если юзер введет больше 12 символов.», то вот такой код у меня работает:

#include <stdio.h>
#define  SIZE_OF_NICKNAME 12
int main()
{
    char nickname[SIZE_OF_NICKNAME];  //Имя персонажа
    printf("Введите имя : ");
    char format[10];
    snprintf(format, sizeof(format), "%%%us", SIZE_OF_NICKNAME - 1);
    scanf(format, nickname);
    printf("%s\n", nickname);
    return 0;
}
$ ./test 
Введите имя : 123456789012345678901234567890
12345678901
andreyu ★★★★★
()
Ответ на: комментарий от theNamelessOne

Спасибо.Вот решение проблемы.

 #include <stdio.h>
 #define  SIZE_OF_NICKNAME 25 //Русские символы в Си занимают по два байта => 12*2 +'\0'
 
 int main(void) 
  {  
   char nickname[SIZE_OF_NICKNAME];  //Имя персонажа
    
    printf("Введите имя : ");
    fgets(nickname, 25, stdin);
    printf("Имя: %s\n",nickname);

  }

Deleted
()
Ответ на: комментарий от Deleted

На заметку, вывод (stdout) может быть буфферизированным по-строчно (чтобы вывелось строка должна оканчиваться на \n). Попробуй еще этот вариант:

#include <stdio.h>
#define  SIZE_OF_NICKNAME 25
 
int main(void) 
 {  
   char nickname[SIZE_OF_NICKNAME];  //Имя персонажа
    
    printf("Введите имя : ");
    fflush(stdout); /* принудительно заставляем вывести все из буфера на экран */
    scanf("%24s", nickname);
    printf("Имя: %s\n",nickname);
    return 0;
 }
И когда компилируешь пользуйся вывод ошибок и сообщений:
gcc -Wall -Wextra main.c
Будет проще отслеживать ошибки и опечатки.

gh0stwizard ★★★★★
()
Ответ на: комментарий от Deleted

Русские символы в Си занимают по два байта => 12*2 +'\0'

Так ещё попробуй:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void) {
  setlocale(LC_ALL, "");
  const size_t SIZE_OF_NICKNAME = 12;
  wchar_t nickname[SIZE_OF_NICKNAME];
  wprintf(L"Enter name: ");
  fgetws(nickname, SIZE_OF_NICKNAME, stdin);
  wprintf(L"You've entered: %S\n", nickname);
  return 0;
}
theNamelessOne ★★★★★
()

Если нет привязки к ISO C.

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
        char *nickname;
        printf("Введите имя: ");
        scanf("%ms", &nickname); /* !(ISO C) */
        free(nickname);
        return EXIT_SUCCESS;
}

Deleted
()
Ответ на: комментарий от Deleted

Русские символы в Си занимают по два байта

Русские символы в UTF-8 занимают по два байта. Локаль у тебя с кодировкой UTF-8.

fixed

quoob
()
Ответ на: комментарий от qulinxao

mittorn ★★★★★ (29.01.2016 19:59:54) Anakros: Попробуй подключиться к мозгу. mittorn: Не помогло

Deleted
()
Ответ на: комментарий от Deleted

//Русские символы в Си занимают по два байта => 12*2 +'\0'

Опять бред. Русский символ в utf-8 занимает 2 байта, но к языку С это никакого отношения не имеет.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.