Wyświetlanie napisu bez użycia []

0

Napisz program, który wyświetli tekst na ekranie bez używania funkcji printf/puts. Podpowiedź: jaka inna funkcja pozwala wyświetlać znaki na ekranie?
W programie nie wolno użyć [].

Tekst wejściowy: const char* t1 = "Ala Ma Kota a kot Ma AlE";

Proszę o pomoc

0

Co konkretnie jest problemem?

0

Za bardzo nie wiem jaką funkcje mam użyć. Próbowałem write (1,t1,24) oraz (1,"Ala Ma Kota a kot Ma AlE",24) jednak wyskakuje błąd: implicit declaration of function ‘write’.

0

Nie zainkludowałeś odpowiedniego nagłówka. Swoją drogą write to funkcja posixowa, w zadaniu pewnie chodziło o fwrite

0

Ale w poleceniu nie ma mowy o zapisie do pliku

0

No nie ma. Masz zapisać do wyjścia standardowego.

0

Napisałem następującą funkcję:

fwrite(t1,1,24,stdout);

Teraz sprawdzarka wyświetla następujący błąd:

Błąd: Wyświetlanie danych miało odbywać się za pomocą wskaźnika!
2

To znaczy, że pewnie miałeś użyć putc. Antybrawa dla prowadzącego za odrzucenie programu zgodnego z zadaną treścią.

0

Zgadza się, funkcja putc dała radę. Jeżeli można to mam jeszcze jedno zadanie:

Zakładając, że ciągi znaków w języku C zapisane są w formacie ASCIIZ, napisz program wyznaczający i wyświetlający długość tekstu pobranego od użytkownika (nie więcej niż 1010 znaków). Do obliczania długości tekstu przygotuj specjalną funkcję, której prototyp powinien wyglądać następująco:

int ASCIIZ_length(const char* txt);

Funkcja powinna zwrócić wartość -1 w przypadku przekazania do niej błędnych danych wejściowych, w pozostałych przypadkach ma zwrócić długość tekstu.

W jaki sposób ma pomóc mi informacja o kodzie ASCIIZ jeżeli chodzi o długość tekstu?
Kod ASCII to np. 65 = "A"
Nie lepiej po prostu liczyć litery dopóki "\0"?

0

ASCIIZ oznacza właśnie, że koniec napisu jest oznaczany zerem, więc powinieneś policzyć znaki (a nie tylko litery) aż napotkasz zero.

1
MalinoVsky. napisał(a):

Napisałem następującą funkcję : fwrite(t1,1,24,stdout);
Teraz sprawdzarka wyświetla następujący błąd :

Błąd: Wyświetlanie danych miało odbywać się za pomocą wskaźnika!

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

int main(void)
{
    const char *s = "Hello 4programmers.net!\n";
    fwrite(s, sizeof(*s), strlen(s), stdout);
    fflush(stdout);
    
    return EXIT_SUCCESS;
}

https://wandbox.org/permlink/1xSgz9X5QNz0qrou
Wskaźnik jest.
Te zadanie jest durne. IMO wszelkie zadania pisane na siłę pod użycie konkretnego API lub feature języka tak naprawdę niczego nie uczą. Odwracanie relacji: najpierw rozwiązanie, a potem problem, który ma to rozwiązać, daje zwykle dziwne wyniki (zadania do rozwiązania).

Możesz podać linka do treści lub wkleić dosłowną treść zadania.

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

int ASCIIZ_length(const char* txt){
	int i;
	if (txt == NULL) return -1;
	for(i = 0; ; i++){
		if(*(txt+i) == "\0") return i;
	}
}

int main() {
	
	printf("TEXT: ");
	char text[1010];
	gets(text);
	char *t = text;
	
	printf("%d", ASCIIZ_length(t));
	
	return 0;
}

Podaje text program startuje ale nie kończy. Co jest nie tak ?

0

"\0" to string, nie znak.

0

A dobrze przekazałem tablice do funkcji? Bo gdy podmieniam "\0" na znak np "k" to i tak wywala program

0

"k" też jest stringiem. Literały znakowe używają '.

0

No tak, ależ głupi błąd. Dzięki wielkie.

0

Btw jeśli masz pobrać 1010 znaków to prawdopodobnie musisz doliczyć jeszcze bajt na null terminator ;)

2

Nigdy, prze-nigdy nie używaj gets(...). Ta funkcja nie testuje ile bajtów czyta co kończy się częstym naruszeniem bezpieczeństwa i stabilności działania aplikacji. gets() jest już DEPRECATED. Zamiast niej użyj fgets(...). Ta ostatnia testuje ilość wczytywanych danych.

No i ASCIIZ_length(...) może być mniejsze...

int ASCIIZ_length(const char* txt){
    int i = 0;
    if (txt != NULL) {
    	while(*txt++) {
    	    ++i;
    	}
    	return i;
    }
    return -1;
}
1

Warto korzystać z gets gdzie potrzebna jest wydajność wczytywania danych do bufora.
Jak zrobić żeby ta funkcja była bezpieczna?
To proste, wystarczy zadeklarować rozmiar bufora, taki jaki ma strumień. Wszystko jest opisane w standardzie POSIX.

To prawda, że aktualnie może nie robić to wielkiej różnicy wydajnościowej na aktualnych pctach, lecz w przypadku starych ARMów różnica ta jest znacząca.

Całe szczęscie że to "wywalenie z standardu" nic w praktyce nie powoduje. Jak ktoś chce i tak skorzysta.

1 użytkowników online, w tym zalogowanych: 0, gości: 1