Stdin\out

bartek164
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:534
0

czemu program nie chce się łaskawie zkończyć

Kopiuj
#include <stdio.h>
void filecopy(FILE*, FILE*);

int main(int argc, char* argv[])
{
    FILE* fp =fopen("dane.txt","r");
    char* program = argv[0];
    printf("%d\n", argc);
    if (argc == 1)
        filecopy(fp, stdout);
  
    return 0;
}
void filecopy(FILE* ifp, FILE* ofp)
{
    int c;
    while ((c = getc(stdin)) != 0)  // <<<<<------ jak wpisze 0 z klawiatury
        fputc(c, ofp);
}

GS
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 18 godzin
  • Postów:1265
1
bartek164 napisał(a):
Kopiuj
void filecopy(FILE* ifp, FILE* ofp)
{
    int c;
    while ((c = getc(stdin)) != 0)  // <<<<<------ jak wpisze 0 z klawiatury
        fputc(c, ofp);
}

A nie powinno być czasem:

Kopiuj
while ((c = getc(stdin)) != '0')  // <<<<<------ jak wpisze 0 z klawiatury
bartek164
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:534
0

acha, bo 0 to pierwszy znak z ansi, aha rozumiem

tubiz
Na tym każdy się złapał :-)
bl4ster
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Lublin
  • Postów:197
1

'0' to znak, a nie liczba. W ascii wynosi 48, czyli możesz napisać:

Kopiuj
while ((c = getc(stdin)) != 48)  // <<<<<------ jak wpisze 0 z klawiatury

"Jesteśmy świadomymi istotami, a życie jest sposobem w jaki wszechświat poznaje sam siebie." prof. Brian Cox
bartek164
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:534
0

możecie zobaczyć dlaczego to nie działa?

Kopiuj

int main(int argc, char *argv[]){
//char* temp[] = argv; nie można tak przypisać?
int i;
char* temp[argc];
for(i=0;i<argc;++i)
temp[i]=argv[i];

while( ++*temp !=NULL)
 printf("%s\n",*temp);    

edytowany 1x, ostatnio: bartek164
bartek164
wpisuje się prawidłowo do tablicy temp, a następnie nie wiem dlaczego ale literuje po wszystkich wartościach pojedynczej tablicy, nie wiem dlaczego tam ma byc <=argc
atmal
A nie możesz operować na argv?
bartek164
nie! bo sie wskażnik przesunie, mam już zrobione nizej ale nie wiem dlaczego do ... nie moge zkompilowac bo pisze ze potrzebuje wartosci do required operand
bartek164
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:534
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[]){
int i;

char* temp[2];
for(i=0;i<=argc;++i)
temp[i]=argv[i];

while( *(temp++) != NULL)
  printf("%s\n",*temp);



return 0;
}
bartek164
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:534
0

dlaczego moge wykonać instrukcje argv++;
a temp ++; już nie

GS
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 18 godzin
  • Postów:1265
0
bartek164 napisał(a):
Kopiuj
while( *(temp++) != NULL)
  printf("%s\n",*temp);
Kopiuj

To jest zły sposób na iterowanie. To, że dojdziesz do końca tablicy, nie oznacza, że temp ani tym bardziej *temp będzie NULL, mogą tam być jakieś śmieci. Skoro wiesz, ze masz argc elementów tablicy, iteruj w pętli for aż do ostatniego indeksu. Po to właśnie to argc jest przesyłane, żeby wiedzieć ile tych argumentów jest na liście.

edytowany 1x, ostatnio: GutekSan
Zobacz pozostały 1 komentarz
GS
Napisałem ci dlaczego. Nie próbuj przesuwać temp, tylko iteruj po kolejnych elementach temp[].
bartek164
ale why , argv ma lepsze przywileje ze mozna
GS
temp jest wskaznikiem na pierwszy element tablicy temp[]. temp++ oznacza temp=temp+1, czyli zwiększ wskażnik o 1 i przypisz go do poprzedniej wartości. To oznacza, że próbujesz przesunąć początek tablicy, zamiast przesuwać się po jej elementach.
bartek164
a argv++ tez jest tablica
bartek164
no ja rozumiem co mowisz
bartek164
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:534
0

no a tak?

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

int main(int argc, char* argv[])
{

    char** temp = &argv;

    while (*(temp++) != NULL)
        printf("%s\n", *temp);

    return 0;
}

GS
Chyba nie czytasz tego, co Ci piszę...
bartek164
czekaj, co ja tu zrobiłem, no dobra może ten kod nie ma sensu, bo *temp = argv?
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:2 minuty
0

powinno być raczej

Kopiuj
void filecopy(FILE* ifp, FILE* ofp)
{
    int c;
    while ((c = getc(ifp)) != EOF) // tu były DWA błędy
        fputc(c, ofp);
}

http://www.cplusplus.com/reference/cstdio/EOF/


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
bartek164
tyyttyyt, nie o to chodziło, bo to był taki program naukowy, czyli bez sensu, ćwiczenia

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.