LINUX.ORG.RU

scanf(«%s»,char*) Что-то не так :(


0

1

Даже спрашивать как-то стыдно :-[ Короче вот... или у меня мозг отформатировать или что то с консолью (после первого пробела все символы пропадают):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char *string = (char*)malloc(256);
//string = (char*)«1.5 1.6»;
//char string[input_size] = «1.5 1.6»;
scanf(«%s»,string);
printf(«%s
dbug:%d
»,string, strlen(string));
return 0;
}

Результат работы:
1.5 1.6 //это ввод с клавиатуры
1.5 // это вывод (после первого пробела все символы пропадают)
dbug:3 //вывод длинны строки

_____________________________________________
Вариант без сканФ
_____________________________________________
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char *string = (char*)malloc(256);
string = (char*)«1.5 1.6»;
//char string[input_size] = «1.5 1.6»;
//scanf(«%s»,string);
printf(«%s
dbug:%d
»,string, strlen(string));
return 0;
}

Результат работы:
1.5 1.6 //Вывод
dbug:7


К первому коду добавил для проверки


for (int i = 0; i < 7; i++)
printf(«%d\n», string[i]);

1.5 1.6
1.5
dbug:3
49
46
53
0
0
0
0

★★

Маны почитать не бывает?

       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 character
              ('\0'), which is added automatically.  The input string stops at
              white  space  or  at  the  maximum field width, whichever occurs
              first.
И да, scanf небезопасен с точки зрения переполнения буфера.

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

Спасибо!!! Впредь буду внимательные...

DenisPA ★★
() автор топика

Я в лабе использовал

scanf ("%m[0-9.- ]", &nline);
Если дополнить нужными символами - возможно, сработает. Следует учесть, на оффтопике флага m нет.

age
()

Кстати, в манах написано про «волшебный» ключик %a, позволяющий либо по-стандартному считывать строку (%as), либо указывать диапазон (%a[...]). При работе с ним память для буфера выделяется автоматически (т.е. ее надо чистить при помощи free), зато переполнения не будет!

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

У меня %а почему-то не работал с диапазоном символов. Кто-нибудь может подтвердить/опровергнуть?

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

Все работает. Вот код из мана:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
main(){
           char *p;
           int n;

           errno = 0;
           n = scanf("%a[a-z ]", &p);
           if (n == 1) {
               printf("read: %s\n", p);
               free(p);
           } else if (errno != 0) {
               perror("scanf");
           } else {
               fprintf(stderr, "No matching characters\n");
           }
}
Запускаю:
./a.out 
asta lavista
read: asta lavista

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

Да, больше 4к символов не дает ввести (но это, похоже, ограничение bash'а).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от age

Кстати да! Но легче дополнить не нужными :) scanf («%s[^\n]», &nline); //до первого переноса...

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