Problem z fgets()

0

Mam następujący problem, mam napisać program który pobierze od użytkownika dwa teksty, max 1000 znaków i potem coś tam zrobi. Problem zaczyna się gdy texty są >= 1000 znaków, program wtedy omija pobranie drugiego tekstu i leci dalej, w czym mój błąd?

int main()
{
	char txt1[1001];
	printf("Wprowadz napis pierwszy: ");
	fgets(txt1, 1001, stdin);
	int len = my_strlen(txt1);
	if (len > 0 && *(txt1 + len - 1) == '\n')
		*(txt1 + len - 1) = '\0';

	char txt2[2002];
	printf("Wprowadz napis drugi: ");
	fgets(txt2, 1001, stdin);
	int len2 = my_strlen(txt2);
	if (len2 > 0 && *(txt2 + len2 - 1) == '\n')
		*(txt2 + len2 - 1) = '\0';

	int lenght1 = my_strlen(txt1);
	int lenght2 = my_strlen(txt2);

	printf("%d %d\n", lenght1, lenght2);
	my_strcat(txt2, txt1);
	printf("%s\n", txt2);
	my_strcpy(txt2, txt1);
	printf("%s", txt2);

	return 0;
}
0

Problem leży w czytaniu dokumentacji:
https://en.cppreference.com/w/c/io/fgets

Reads at most count - 1 characters from the given file stream and stores them in the character array pointed to by str.

Pytanie co chcesz zrobić jeśli tekst się nie mieści w limicie?

0

Jak dobrze rozumiem program ma pobrać 2 teksty, gdy tekst1 > 1000 ma uciąć resztę i przejść do pobrania tekstu 2 i także uciąć powyżej 1000 znaków
Treść zadania:
"Napisz program, który pobierze od użytkownika dwa teksty (txt1 oraz txt2, nie więcej niż 1000 znaków każdy), a następnie w oddzielnych liniach wyświetli:"

0

Skoro masz taką treść to nie kombinuj.
Znaczy, że nigdy nie będziesz miał danych wejściowych większych od limitu.
Doczytaj dokumentację, to się okaże, że potrzebujesz tablicy na 1002 elementy, a nie na 1001 (znak końca linii i znak końca napisu).

0

Niestety testy automatyczne podają teksty dłuższe jak 1000 znaków

0

Podaj pełną treść, albo napisz sobie kod, który zignoruje nadmiarowe dane.

0

Piszę tutaj bo właśnie nie potrafię ograniczyć tego i miałem nadzieję, że ktoś mógłby mi pokazać jak to ma wyglądać.
Treść zadania:
screenshot-20190408171743.png

0

Zadanie jest nieprecyzyjnie opisane.
Wygląda tak, jakby gwarantował napisy nie dłuższe niż 1000 (chyba, że coś źle robisz i limit jest spełniony - co jest prawdopodobne, o czym pisałem wcześniej).

Nie jest zdefiniowane co się ma dziać jeśli dane są dłuższe od limitu.

Poniżysz kod ignoruje część linii wykraczającą poza limit 1000 znaków.

if (2 == scanf("%1000[^\n]%*[^\n]%*1[\n]%1000[^\n]%*[^\n]%*1[\n]", text1, text2)) {
    ....
}
0

Ewentualnie coś takiego, ale to już jest poza treść zadania ;p

#include <stdio.h>
#define STR_MAX 1000

char* myStrCpy(char* dest, const char* src);
char * myStrCat(char *dest, const char *src);
int myStrlen(const char * src);
char *myStrChr(const char *str, int c);
void myScanf(char* dest, FILE* stream, int sizeMax);

int main()
{
    char txt1[STR_MAX];
    char txt2[STR_MAX];
    myScanf(txt1, stdin, STR_MAX);
    myScanf(txt2, stdin, STR_MAX);
    printf("%d %d\n", myStrlen(txt1), myStrlen(txt2));
    printf("%s\n", myStrCat(txt2, txt1));
    myStrCpy(txt2, txt1);
    printf("%s\n", txt2);
    return 0;
}

char* myStrCpy(char* dest, const char* src)
{
   char *res = dest;
   while(*dest++ = *src++)
       ;
   return res;
}

char * myStrCat(char *dest, const char *src)
{
    myStrCpy(dest + myStrlen(dest), src);
    return dest;
}

int myStrlen(const char * src)
{
    const char *str;
    for (str = src; *str; str++)
        ;
    return str - src;
}

char *myStrChr(const char *str, int c)
{
    while (*str != (char)c)
        if (!*str++)
            return 0;
    return (char *) str;
}

void myScanf(char* dest, FILE* stream, int sizeMax)
{
    if(fgets(dest, sizeMax, stream)){
        char *first_new_line;
        if(first_new_line=myStrChr(dest, '\n')){
            *first_new_line = 0;
        } 
        else {
            scanf("%*[^\n]");
            scanf("%*c");
        }
    }
}

0

Mój format string okazał się mieć problemy, takie coś działa:

if (1 == scanf("%1000[^\n]%*[^\n]", text1)) {
    getc(stdin);
    if (1 == scanf("%1000[^\n]%*[^\n]", text2)) {
        getc(stdin);

        doStufWith(text1, text2);
    }
}

https://wandbox.org/permlink/LbTqRp1gP0ZujnGn

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