c - UNIX syscall 'læse' og 'skrive' i Windows

Indlæg af Hanne Mølgaard Plasc

Problem




    Dette spørgsmål har allerede et svar her:

    

            

  •             Printf udskrivning affald efter læsning () opkald. Forskydningen er altid trykt som 0
                    
                        3 svar
                    

            

  •         

  •             Affald trykt ved brug af strcpy
                    
                        5 svar
                    

            

  •     

Bedste reference


Problemet har intet at gøre med platform eller operativsystem. Det handler kun om, at du savner strengterminatoren . /questions/26858567/printf-printing-garbage-after-read-call-the-offset-is-always-printed-as-0 /questions/11161609/garbage-being-printed-when-using-strcpy


I C a char streng kaldes virkelig en null-termineret byte streng . At null-termineret -bit er vigtigt, fordi alle funktioner behandler en peger til char som en streng, ser denne terminator for at vide, hvornår strengen slutter.


Det betyder, at en streng på fire tegn faktisk har plads til fem , hvor sidstnævnte er karakter null-terminator karakter ''.


Ved at ikke have terminatoren kan og-strengfunktionerne være uden for grænserne leder efter terminatoren, hvilket fører til udefineret adfærd . [7]


Så:


char buf[5];  // 4 + 1 for terminator
int size = \_read(fd, buf, 4);  // Windows and the MSVC compiler doesn't really have read

// \_read (as well as the POSIX read) returns -1 on error, and 0 on end-of-file
if (size > 0)
{
    buf[size] = '';  // Terminate string
    printf("the string is \%s
", buf);
}