Avatar billede Daniel.E Praktikant
06. juli 2004 - 22:55 Der er 10 kommentarer og
1 løsning

bestemt altal karektere

fgets læser kun de antal karektere man har skrevet den skal læse...men man kan godt skrive flere.

fgets(user_input,10,stdin);

hvordan gør man hvis der ikke skal kunnes tastes mere end 10 karektere ?
Avatar billede arne_v Ekspert
06. juli 2004 - 23:00 #1
Du kan ikke forhindre brugeren i at trykkke på tasterne.

Men jeg formoder at de du ønsker er at op til N taster så echoes de
og indlæses normalt - derefter skal den bare bippe eller på anden
vis beklage sig.

Det kan du ikke gøre med normal console IO (stdio etc.).

Der er formentligt nogle platform og compiler specifikke muligheder. Hvis
du fortæller os hvilken platform & compiler du bruger kan vi muligvis
hjælpe.

Er du stadig rimeligt frøn til C/C++ så vent med det her til senere
og forslt med standard console IO.
Avatar billede Daniel.E Praktikant
06. juli 2004 - 23:16 #2
jeg arbejder på en Red Hat 9.0 og bruger gcc compileren.

jeg har programmeret en lille system som kan modtage en stykke tekst fra brugeren, men der sker noget underligt hvis man skriver mere end 1 linie.

Et lille eksempel (taget fra dos)

c:\mkdir hejmeddigapkdjsadjakskldjsadsajdaksjdksajkajdksajdksajdksajkdjkjkjkjkjkjkjkjkjkjkjakjkjkjkjkkjkjaskdjsakjdksajkdsadsajdksjdk

her er 2 linier.  Når jeg så trykker enter så sker dette:
c:\
c:\
c:\(klar)

Jeg har ikke "c:\", men noget andet, bare et eksempel.
Avatar billede Daniel.E Praktikant
06. juli 2004 - 23:17 #3
der skulle være 2 linie men den er vidst bare bleven forlænget....

så tænkte jeg at hvis man mindsker det sådan at brugeren ikke kan indtaste mere end 1 linie, så sker det der underlige ikke.
Jeg ved godt at det er en fejl et eller andet sted i koden som forudsager dette, men jeg kan ikke finde den, og jeg har ledt i 2 måneder nu.
Avatar billede Daniel.E Praktikant
06. juli 2004 - 23:18 #4
skal man bruger ncurses ?
Avatar billede bertelbrander Novice
06. juli 2004 - 23:25 #5
Ja, ncurses er nok det rigtige.

Se:
http://www.hmug.org/man/3/curs_getch.html
Avatar billede Daniel.E Praktikant
06. juli 2004 - 23:36 #6
bertelbrander

du har vel ikke noget mere specifikt information som du kan skrive....f.eks hvordan man gør ?
Avatar billede bertelbrander Novice
06. juli 2004 - 23:53 #7
Du kan bruge getch til at læse en karakter af gangen, derved kan du stoppe når brugeren har tastet det maksimale antal.

Du kan starte med at lave en loop hvor du putter den seneste karakter ind i enden af et char array, og så stoppe når brugeren trykker Enter eller har trykket det antal han må.

Noget i stil med:

#define MAX 10
int i;
char Buf[Max + 1];
char ch = 0;
for(i = 0; i < 10 && ch != '\n'; )
  if((ch = getch()) != '\n')
    Buf[i++] = ch;
Buf[i] = '\0';

Du skal dog være opmærksom på specielle taster, som f.ex. pile taster, dem modtager du som tre karakterer hvor den første er 27 (ESC).

Jeg ved ikke om jeg kan lave programmer med ncurses for tiden, hvis jeg kan, laver jeg lige et eksempel.
Avatar billede bertelbrander Novice
07. juli 2004 - 00:29 #8
Jeg fik lavet et lille eksempel.

Bemærk at det er testet på windows, der kan godt være små forskelle.
Du skal linke med curses, f.ex:
gcc test.c -l curses

#include <curses.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/socket.h>
#include <fcntl.h>

void TextOut(int x, int y, const char *text)
{
  while(*text)
  {
    move(y, x++);
    addch(*text);
    text++;
  }
  refresh();
}

int main(void)
{
  int i;
  char Buf[10], ch = 0;
  initscr();
  cbreak();
  intrflush(stdscr, FALSE);
  clear();
  noecho();

  TextOut(1, 1, "Enter some text:");
  for(i = 0; i < 9 && ch != '\n'; )
  {
      switch(ch = getch())
      {
      case 27:
        getch(); /* Ignore */
        getch(); /* Ignore */
        break;
      case 8: // Backspace
        if(i)
        {
            i--;
            Buf[i] = 0;
            TextOut(17 + i, 1, " ");
            move(1, 17 + i);
        }
        break;
      case '\n':
        break;
      default:
        Buf[i++] = ch;
        Buf[i] = 0;
        TextOut(17, 1, Buf);
        break;
      }
  }
  TextOut(1,  2, "You wrote: ");
  TextOut(12, 2, Buf);

  return 0;
}
Avatar billede Daniel.E Praktikant
07. juli 2004 - 18:45 #9
bertelbrander

giv et svar..jeg kunne godt bruge dit eksempel, men jeg skulle bare modifisere lidt i det for at få det som jeg vil have..... :)
Avatar billede bertelbrander Novice
07. juli 2004 - 21:24 #10
Jeg giver ikke svar, jeg forsøger at undgå point.
Avatar billede Daniel.E Praktikant
08. juli 2004 - 13:52 #11
fair nok.. :)  tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester