Zeichen einlesen

seriously

Mitglied
Hallo
Ich arbeite am Microcontroller und kann jetzt dieses Programm nicht jetzt testen(erst in der Schule kann ich es testen).
Deswegen hab ich es hier gepostet damit Sie mir vielleicht sagen können ob das stimmt.

Lesen Sie mit _getkey() solange ein Zeichen in einen String ein, bis der Benutzer
entweder 10 Zeichen eingegeben oder Enter gedrückt hat. Die Eingabe von Enter löst das
Senden der beiden Zeichen '\r' und '\n' aus. Wurde ein Großbuchstabe eingelesen, so soll
dieser als Kleinbuchstabe gespeichert werden. Schließen Sie den String ab und geben Sie ihn
mit Hilfe der Funktion printf() aus. Beenden Sie die Ausgabe mit einem abschließenden
Zeilenumbruch.


Die Funktion _getkey ist eine Funktion die Zeichen von der Tastatur einliest:

Code:
/*
 * RS232Scan.c
 *
 * Created: 27.05.2013 14:44:40
 *  Author: Sasa
 */ 

#include <avr/io.h>
#include <stdio.h>
#include <stdint.h>
#include "USART.h"

int main(void)
{
	char buf[11];

	 
    while(1)
    {
  
		printf("\nEnter 10 chars: ");
		for(int16_t i=0; i<10 || i != '\r' ; i++)
		{
            buf[i]= _getkey();
			buf[i]= tolower(buf[i]);
			
			if (buf[i] == '\r')
			{
		        buf[i]='\0';
			}			
			i=10;
			buf[11]='\0';
			printf("\nText: %s", buf);
		}			
    }
	return 0;
}
 
Hi

buf braucht erstens mal 12 Zeichen Platz, nicht 11.
Weil: 9 Zeichen eingeben und dann Enter ist gültig, das macht
9 Zeichen + \r + \n + \0 = 12 Zeichen

Und die ganze for-Schleife schaut leider ziemlich falsch aus
Vorschlag stattdessen:
C++:
int16_t i = 0;

while(i < 10)
{
    buf[i] = tolower(_getkey());
    if(buf[i] == '\n')
    {
        buf[i++] = '\r';
        buf[i++] = '\n';
        break;
    }
    i++;
}
buf[i] = '\0';

printf("%s\n", buf);
 
@sheel:
Schreibst du nicht \r\r\n in den Buffer? Gemäss Beschreibung gibt _getkey ja zuerst \r, dann \n zurück. Du prüfst ja, ob das Zeichen \n ist, dann hast du also \r schon reingeschrieben, anschliessend schreibst du nochmals \r\n rein.

Grüsse
Cromon
 
Hm. Merk grad, ich hab keine Ahnung, was _getkey() da tut.
Wenn es nur \n liefern würde würds gehen, sonst...

@seriously: Vllt. weißt du es ja, sonst probier es (was _getkey für Enter liefert),
sobald du wieder du Möglichkeit hast.

Ein Programm mit
C++:
while(1)
    printf("%d ", _getkey());
Und da schauen, was bei einem Enterdruck rauskommt.

C++:
//nur 10 (\n)

int16_t i = 0;
 
while(i < 10)
{
    buf[i] = tolower(_getkey());
    if(buf[i] == '\n')
    {
        buf[i++] = '\r';
        buf[i++] = '\n';
        break;
    }
    i++;
}
buf[i] = '\0';
 
printf("%s\n", buf);

//nur 13 (\r)

int16_t i = 0;
 
while(i < 10)
{
    buf[i] = tolower(_getkey());
    if(buf[i] == '\r')
    {
        buf[++i] = '\n';
        break;
    }
    i++;
}
buf[i] = '\0';
 
printf("%s\n", buf);

//10 13 (\n\r)

int16_t i = 0;
 
while(i < 10)
{
    buf[i] = tolower(_getkey());
    i++;
    if(buf[i - 1] == '\r')
        break;
}
buf[i] = '\0';
 
printf("%s\n", buf);

//13 10 (\r\n)

int16_t i = 0;
 
while(i < 10)
{
    buf[i] = tolower(_getkey());
    i++;
    if(buf[i - 1] == '\n')
        break;
}
buf[i] = '\0';
 
printf("%s\n", buf);
 
Zurück