πŸ₯§ ПисањС Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎΠ³ ΠΊΠΎΠ΄Π° Ρƒ Π¦-Ρƒ

Π’ΠΎ ΡˆΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Ρ‚Π΅ Ρƒ Π¦-Ρƒ, Π½Π΅ Π·Π½Π°Ρ‡ΠΈ Π΄Π° ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ лош/слоТСн/Π΄ΡƒΠ³Π°Ρ‡Π°ΠΊ ΠΊΠΎΠ΄. Π¦ нијС Π½Π΅ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Ρ™, Ρ˜Π΅Ρ€ лош ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° сС пишС Ρƒ Π±ΠΈΠ»ΠΎ ΠΊΠΎΠΌ Ρ˜Π΅Π·ΠΈΠΊΡƒ Π° Π΄ΠΎΠ±Π°Ρ€/Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π°Π½/ΠΊΡ€Π°Ρ‚Π°ΠΊ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° сС пишС ΠΈ Ρƒ Π¦-Ρƒ. ΠŸΠΎΠΊΠ°Π·Π°Ρ›Π΅ΠΌΠΎ ΠΊΠ°ΠΊΠΎ сС 20Π°ΠΊ Ρ€Π΅Π΄ΠΎΠ²Π° Π¦ ΠΊΠΎΠ΄Π° који сС Π±Π°Π²ΠΈ нискама ΠΌΠΎΠΆΠ΅ Π΄Π° свСдС Π½Π° јСдан Π΄ΠΎ Π΄Π²Π° Ρ€Π΅Π΄Π°.

Π£Π³Ρ€Π΅Π΄, β€œΠ½ΠΈΡΠΊΠ°β€ нијС Π½Π°Ρ˜ΡΡ€Π΅Ρ›Π½ΠΈΡ˜ΠΈ ΠΏΡ€Π΅Π²ΠΎΠ΄ Π·Π° стринг (ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС ниска користи Π·Π° бисСрС, ΠΌΠ°Π΄Π°, Ρƒ извСсном смислу, Π¦ стрингови Ρ˜Π΅ΡΡƒ бисСри), Π°Π»ΠΈ, још јС јСдино ΠΏΡ€ΠΈΡ…Π²Π°Ρ‚Ρ™ΠΈΠ²Π° β€œΡΡ‚Ρ€ΡƒΠ½Π°β€, Π° ниска сС Ρ€Π΅Ρ’Π΅ користи Ρƒ ΠΎΠ±ΠΈΡ‡Π½ΠΎΠΌ Π³ΠΎΠ²ΠΎΡ€Ρƒ, ΠΏΠ° јС мања шанса Π΄Π° сС ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎ Ρ‚ΡƒΠΌΠ°Ρ‡Π΅ΡšΠ΅ (ΠΈ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΏΡ€Π΅Π²ΠΎΠ΄ β€œΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΡΠΊΠΎΠ³ ЈСзика Ц” користи ΠΈΠ·Ρ€Π°Π· β€œΠ½ΠΈΡΠΊΠ°β€).

Π‘Π²ΠΈ ΠΊΠ°ΠΆΡƒ Π΄Π° јС Π¦ катастрофа Π·Π° Ρ€Π°Π΄ са нискама

Оно ΡˆΡ‚ΠΎ сС ΠΎΠ±ΠΈΡ‡Π½ΠΎ мисли јС Π΄Π° β€œΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π° сС ради” Π΄Π° Π±ΠΈ сС ΠΎΠ±Ρ€Π°Ρ’ΠΈΠ²Π°Π»Π΅ нискС Ρƒ Π¦-Ρƒ, Ρ˜Π΅Ρ€ Π½Π΅ ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ ΠΏΡ€Π°Π²Π° Π°ΠΏΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡ˜Π°. ΠŸΠΎΡΡ‚ΠΎΡ˜ΠΈ само ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΡ˜Π°, ΠΏΠΎΠ΄Ρ€ΠΆΠ°Π½Π° ΠΎΠ΄ странС дословних ниски (Π΅Π½Π³. string literal) ΠΈ стандарднС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Π΄Π° јС Π½ΠΈΠ· Π·Π½Π°ΠΊΠΎΠ²Π° који сС Π·Π°Π²Ρ€ΡˆΠ°Π²Π° НУЛ Π·Π½Π°ΠΊΠΎΠΌ ('\0') ΡƒΠΏΡ€Π°Π²ΠΎ ниска.

Ово Ρ˜Π΅ΡΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π°Π»ΠΈ, Π²Ρ€Π»ΠΎ чСсто, нијС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ β€œΠΏΡ€Π°ΡΠΈΡ‚ΠΈ сС” Ρƒ ΠΎΠ±Ρ€Π°Π΄ΠΈ ниски. Π‘Π°ΠΌΠΎ Ρ‚Ρ€Π΅Π±Π° Π±ΠΈΡ‚ΠΈ ΠΏΠ°ΠΆΡ™ΠΈΠ².

Π”Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ Ρ‚Π°Ρ˜ лош ΠΊΠΎΠ΄.

Π‘Π»Π΅Π΄ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° написани Ρƒ ΠΊΠΎΠΌΠ΅Ρ€Ρ†ΠΈΡ˜Π°Π»Π½ΠΈΠΌ условима, ΠΎΠ΄ странС ΡƒΠΌΠ΅Ρ€Π΅Π½ΠΎ искусног ΠΈ способног ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€Π° који Π·Π½Π° Π¦. Π’ΠΎ јС Π΄ΠΎΠ±Π°Ρ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊΠΎ β€œΡΡ‚Ρ€Π°ΡˆΠ½Π΅β€ ствари Ρ™ΡƒΠ΄Π΅ ΠΏΡ€Π°Π²Π΅ Ρƒ Π¦-Ρƒ, Π±Π΅Π· ΠΈΠΊΠ°ΠΊΠ²ΠΎΠ³ Ρ€Π°Π·Π»ΠΎΠ³Π°.

#define EXPECTED_STRING "Whatev"

int read_expected_string(int stream)
{
    char line[1024];
    size_t expected_len = strlen(EXPECTED_STRING);
    
    int count = read(stream, line, sizeof line);
    int line_length = (count < sizeof(line)) ? count : (sizeof(line) - 1); 

    if(line_length < (version_tag_len)) 
    { 
        return FAILURE; 
    } 

    line[line_length] = '\0'; 
    line[version_tag_len] = '\0'; 

    if(!strcmp(line, EXPECTED_STRING)) 
    { 
        return SUCCESS; 
    } 
    return FAILURE; 
}

ΠŸΡ€ΠΎΠ±Π°Ρ˜Ρ‚Π΅ Π΄Π° схватитС ΡˆΡ‚Π° овај ΠΊΠΎΠ΄ ΠΏΠΎΠΊΡƒΡˆΠ°Π²Π° Π΄Π° ΡƒΡ€Π°Π΄ΠΈ. ΠΠ΅ΠΌΠΎΡ˜Ρ‚Π΅ Π΄Π° Ρ‡ΠΈΡ‚Π°Ρ‚Π΅ Π΄Π°Ρ™Π΅ Π΄ΠΎΠΊ Π½Π΅ ΠΎΡ‚ΠΊΡ€ΠΈΡ˜Π΅Ρ‚Π΅ ΠΎ Ρ‡Π΅ΠΌΡƒ јС Ρ€Π΅Ρ‡, ΠΈΠ»ΠΈ Π²Π°ΠΌ сС просто смучи ΠΎΠ΄ глСдања.

ΠŸΠΎΡΡ‚ΠΎΡ˜ΠΈ вишС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρƒ ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Ρƒ. НСкС Π±ΠΈ Ρ€Π΅ΡˆΠΈΠΎ Π΄ΠΎΠ±Π°Ρ€ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ˜ΡƒΡ›ΠΈ ΠΏΡ€Π΅Π²ΠΎΠ΄ΠΈΠ»Π°Ρ† (strlen() Ρ€Π°Ρ‡ΡƒΠ½Π° Π΄ΡƒΠΆΠΈΠ½Ρƒ дословнС нискС, намСсто Π΄Π° сС ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈ sizeof). НСки β€œΠ³Π΅Π½ΠΈΡ˜Π°Π»Π½ΠΈβ€ ΠΏΡ€Π΅Π²ΠΎΠ΄ΠΈΠ»Π°Ρ† Π±ΠΈ Ρ‡Π°ΠΊ ΠΌΠΎΠ³Π°ΠΎ Π΄Π° Π·Π°ΠΊΡ™ΡƒΡ‡ΠΈ Π΄Π° Π½Π΅ΠΌΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±Π΅ Π·Π° line[line_length] = '\0', Ρ˜Π΅Ρ€ version_tag_len <= line_length, ΠΏΠ° Π½Π°Ρ€Π΅Π΄Π½ΠΈ Ρ€Π΅Π΄ Π½ΠΈΡ‡Π΅ΠΌΡƒ Π½Π΅ слуТи, ниска јС Π²Π΅Ρ› ΠΎΠΊΡ€Π°Ρ›Π΅Π½Π° вишС Π½Π΅Π³ΠΎ ΡˆΡ‚ΠΎ Ρ›Π΅ Ρ‚ΠΎ Ρ‚Π°Ρ˜ Π½Π°Ρ€Π΅Π΄Π½ΠΈ Ρ€Π΅Π΄ Π΄Π° постигнС.

Назив Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ Ρ‚Π°ΠΊΠΎΡ’Π΅ нијС сјајан. Како ΡΡ‚ΠΎΡ˜ΠΈ, Ρ‡ΠΎΠ²Π΅ΠΊ Π±ΠΈ помислио Π΄Π° Ρ›Π΅ stream Π±ΠΈΡ‚ΠΈ Ρ‡ΠΈΡ‚Π°Π½ свС Π΄ΠΎΠΊ Π½Π΅ добијСмо EXPECTED_STRING. Π¨Ρ‚ΠΎ ΡƒΠΏΡ€Π°Π²ΠΎ нијС ΡΠ»ΡƒΡ‡Π°Ρ˜.

Π§Π°ΠΊ ΠΈ Π΄Π° свС ΠΎΠ²ΠΎ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎ срСдимо ΠΌΠΈ ΠΈΠ»ΠΈ наш гСнијални ΠΏΡ€Π΅Π²ΠΎΠ΄ΠΈΠ»Π°Ρ†, ΠΎΠ²ΠΎ јС ΠΈ Π΄Π°Ρ™Π΅ ΠΏΡ€Π΅ΠΊΠΎ свакС ΠΌΠ΅Ρ€Π΅ слоТСно.

Овај ΠΊΠΎΠ΄, Ρƒ ствари, само ΠΆΠ΅Π»ΠΈ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° Ρ˜Π΅Π΄Π½Ρƒ ниску - Ρ€Π΅Π΄ ΠΈΠ· Π½Π΅ΠΊΠΎΠ³ β€œΡ‚ΠΎΠΊΠ°β€ (Π½Π΅Π±ΠΈΡ‚Π½ΠΎ ΡˆΡ‚Π° јС Ρ‚Π°Ρ˜ Ρ‚ΠΎΠΊ - Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, ΡƒΡ‚ΠΈΡ‡Π½ΠΈΡ†Π°, цСв…) ΠΈ ΡƒΠΏΠΎΡ€Π΅Π΄ΠΈ Ρ‚ΠΎ са ΠΎΡ‡Π΅ΠΊΠΈΠ²Π°Π½ΠΎΠΌ ниском. ΠΠΈΡˆΡ‚Π° вишС.

Π£ вашСм ΠΎΠΌΠΈΡ™Π΅Π½ΠΎΠΌ вишСм програмском Ρ˜Π΅Π·ΠΈΠΊΡƒ

Ако ΠΈΠΌΠ°Ρ‚Π΅ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Ρ˜ΡƒΡ›Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π·Π° β€œΡ‚ΠΎΠΊβ€, Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π±ΠΈ Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ (ΠΎΠ²ΠΎ јС Π ΡƒΠ±ΠΈ, Π°Π»ΠΈ слично јС ΠΌΠΎΠ³ΡƒΡ›Π΅ Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Ρ˜Π΅Π·ΠΈΡ†ΠΈΠΌΠ°):

def expect_string(stream)
    stream.read().start_with?(EXPECTED_STRING)
end

Ово ΠΎΡ‡ΠΈΠ³Π΅Π΄Π½ΠΎ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ’ΡƒΡ˜Π΅ Π³Ρ€Π΅ΡˆΠΊΠ΅, Π²Π΅Ρ› сС ослања Π½Π° ΠΈΠ·ΡƒΠ·Π΅Ρ‚ΠΊΠ΅, Π½ΠΈΡ‚ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π° Π΄ΡƒΠΆΠΈΠ½Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎΠ³ - ΠΌΠ°Π΄Π°, Π·Π° Ρ‚Ρƒ сврху, ΠΌΠΎΠΆΠ΄Π° ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ stream.read(max_bytes).

Π‘ΡƒΡˆΡ‚ΠΈΠ½Π° јС Π΄Π° јС ΠΎ ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Ρƒ Π²Ρ€Π»ΠΎ Π»Π°ΠΊΠΎ Ρ€Π°Π·ΠΌΠΈΡˆΡ™Π°Ρ‚ΠΈ ΠΈ доносити Π·Π°ΠΊΡ™ΡƒΡ‡ΠΊΠ΅. ΠŸΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ јС ΠΎΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ ΡˆΡ‚Π° (ΠΆΠ΅Π»ΠΈ Π΄Π°) Ρ€Π°Π΄ΠΈ.

Назад Ρƒ Π¦

Π₯ајдС Π΄Π° ΠΏΡ€ΠΎΠ±Π°ΠΌΠΎ Π΄Π° схватимо β€œΠΎΡ‚ΠΊΡƒΠ΄ сав овај код”. Аутор јС Π±ΠΈΠΎ Ρƒ ΡΡ‚Π°ΡšΡƒ свСсти Π΄Π°, Ρƒ Π¦-Ρƒ, ΠΌΠΎΡ€Π° Π΄Π° сС Π²ΠΎΠ΄ΠΈ Ρ€Π°Ρ‡ΡƒΠ½Π° ΠΎ нискама β€œΡ€ΡƒΡ‡Π½ΠΎβ€. Π¨Ρ‚ΠΎ ΠΈ Ρ˜Π΅ΡΡ‚Π΅ Ρ‚Π°Ρ‡Π½ΠΎ, Π°Π»ΠΈ Ρƒ ствари нијС. Π”Π°ΠΊΠ»Π΅, ΠΌΠΎΡ€Π° Π΄Π° сС Π²ΠΎΠ΄ΠΈ Ρ€Π°Ρ‡ΡƒΠ½Π° Ρ€ΡƒΡ‡Π½ΠΎ, Π°Π»ΠΈ Π½Π΅ ΠΌΠΎΡ€Π° β€œΠ±Π°Ρˆ Π½Π° сваком кораку”.

На вишСм Π½ΠΈΠ²ΠΎΡƒ Π°ΠΏΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡ˜Π΅, овај ΠΊΠΎΠ΄ Ρ€Π°Π΄ΠΈ слСдСћС:

ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° (Ρ€Π΅Π΄) ΠΈΠ· Ρ‚ΠΎΠΊΠ°
ΠΈΠ·Ρ€Π°Ρ‡ΡƒΠ½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ˜Ρƒ Π·Π° НУЛ Π·Π½Π°ΠΊ (Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ниску Ρ€Π΅Π΄Π°)
Π°ΠΊΠΎ јС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΊΠΎ, Π²Ρ€Π°Ρ›Π° ΠΠ•Π£Π‘ΠŸΠ•Π₯
ставља НУЛ Π·Π½Π°ΠΊ Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ Ρ€Π΅Π΄ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ "ΠΏΡ€Π°Π²Ρƒ ниску"
Π°ΠΊΠΎ јС ниска Ρ€Π΅Π΄Π° јСднака ΠΎΡ‡Π΅ΠΊΠΈΠ²Π°Π½ΠΎΡ˜ Π²Ρ€Π°Ρ›Π° Π£Π‘ΠŸΠ•Π₯
ΠΈΠ½Π°Ρ‡Π΅, Π²Ρ€Π°Ρ›Π° ΠΠ•Π£Π‘ΠŸΠ•Π₯

Π‘Π²Π΅ јС Ρ‚ΠΎ Π»Π΅ΠΏΠΎ, Π°Π»ΠΈ, Π½Π΅ ΠΌΠΎΡ€Π° свС Ρ‚ΠΎ Π΄Π° Ρ€Π°Π΄ΠΈ. НСма ΠΏΠΎΡ‚Ρ€Π΅Π±Π΅ Π·Π° Ρ€Π°Ρ‡ΡƒΠ½Π°ΡšΠ΅ΠΌ, Ρ˜Π΅Ρ€ Π½Π΅ΠΌΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±Π΅ Π΄Π° Π·Π° β€œΠΏΡ€Π°Π²ΠΎΠΌβ€ ΠΠ‘Π¦Π˜Π˜Π— ниском. ΠŸΠΎΡ€Π΅Ρ’Π΅ΡšΠ΅ са strcmp() ΡΡ‚Π°Ρ˜Π΅ ΠΊΠΎΠ΄ ΠΏΡ€Π²ΠΎΠ³ НУЛ Π·Π½Π°ΠΊΠ° ΠΈ Π½Π΅Ρ›Π΅ Π±ΠΈΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π°Π²Π°Π½ΠΎ Π΄Π° Π»ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³Π° ниска ΠΈΠΌΠ° НУЛ Π·Π½Π°ΠΊ Π½Π° Ρ‚ΠΎΠΌ мСсту.

Овај ΠΊΠΎΠ΄ јС лош ΠΈΠ· још јСдног Ρ€Π°Π·Π»ΠΎΠ³Π°. НС ΠΎΠ±Ρ€Π°Ρ’ΡƒΡ˜Π΅ Π³Ρ€Π΅ΡˆΠΊΠ΅ ΠΈΠ·Ρ€ΠΈΡ‡ΠΈΡ‚ΠΎ, Π²Π΅Ρ› Ρ‚Ρƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ β€œΠΊΡ€ΠΈΡ˜Π΅β€ ΠΈΠ·Π° β€œΠ°ΠΊΠΎ јС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ прСкратко”. НаимС, read() Π²Ρ€Π°Ρ›Π° -1 Ρƒ ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ Π³Ρ€Π΅ΡˆΠΊΠ΅, ΡˆΡ‚ΠΎ јС, свакако, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΊΠΎ.

Π’Π°ΠΊΠΎ β€œΠΏΠ°ΠΌΠ΅Ρ‚Π°Π½β€ ΠΊΠΎΠ΄ јС лош, Ρ˜Π΅Ρ€ Π΄Π° Π±ΠΈ стС Π·Π½Π°Π»ΠΈ Π΄Π° сС користи ΠΎΠ²Π° прСтпоставка, ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° Π·Π°ΠΊΡ™ΡƒΡ‡ΡƒΡ˜Π΅Ρ‚Π΅ користСћи β€œΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ΅β€. Односно, нијС ΠΌΠΎΠ³ΡƒΡ›Π΅ Π·Π°ΠΊΡ™ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΠΈ ΠΎ ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Ρƒ Π³Π»Π΅Π΄Π°Ρ˜ΡƒΡ›ΠΈ само овај ΠΊΠΎΠ΄.

ПосСбно, Ρƒ ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ Π½Π΅ΠΊΠΈΡ… ΠΏΡ€ΠΎΠΌΠ΅Π½Π°, Ρ€Π΅Ρ†ΠΈΠΌΠΎ, Ρƒ Π½Π°Ρ‡ΠΈΠ½Ρƒ Ρ€Π°Π΄Π° read(), ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°ΡšΡƒ ΠΎΠ²ΠΎΠ³ ΠΊΠΎΠ΄Π° Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Ρƒ са Π½Π΅ΠΊΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜ΠΎΠΌ сродном read(), Π°Π»ΠΈ која ΠΈΠΏΠ°ΠΊ Ρ€Π°Π΄ΠΈ ΠΌΠ°Π»ΠΎ Π΄Ρ€ΡƒΠ³Π°Ρ‡ΠΈΡ˜Π΅, прСтпоставкС Ρ›Π΅ Π΄Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅, ΠΈ овај ΠΊΠΎΠ΄ Ρ›Π΅ Π½Π°Π³Π»ΠΎ Π΄Π° Π·Π°Π³Π»ΡƒΠΏΠΈ.

Π”ΠΎΠ±Ρ€ΠΎ, Π΅Π²ΠΎ ΡˆΡ‚Π° ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° добијСмо Π½Π° основу Π΄ΠΎΡΠ°Π΄Π°ΡˆΡšΠΈΡ… Π·Π°ΠΊΡ™ΡƒΡ‡Π°ΠΊΠ°:

int expect_string(int stream)
{
    char line[1024];
    int count = read(stream, line, sizeof line / sizeof line[0]);

    if (count < 0) {
        return FAILURE;
    }
    
    if (0 == strcmp(EXPECTED_STRING, line)) {
        return SUCCESS;
    }
    else {
        return FAILURE;
    }
}

Π‘Π°Π΄ сС јасно Π²ΠΈΠ΄ΠΈ Π΄Π° нас нијС Π±Ρ€ΠΈΠ³Π° ΠΊΠΎΠ»ΠΈΠΊΠΎ јС Π΄ΡƒΠ³Π°Ρ‡ΠΊΠ° EXPECTED_STRING, ΠΏΠ° просто ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° јС прослСдимо ΠΊΠ°ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π΅Ρ€, Ρ‡ΠΈΠ½Π΅Ρ›ΠΈ саму Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Ρƒ ΠΎΠΏΡˆΡ‚ΠΈΡ˜ΠΎΠΌ. Π£Π· ΠΏΠ°Ρ€ ситних Π¦ Ρ‚Ρ€ΠΈΠΊΠΎΠ²Π°, добијамо Π·Π½Π°Ρ‚Π½ΠΎ ΠΊΡ€Π°Ρ›Π΅:

int expect_string(int stream, char const* expected)
{
    char l[1024];

    return ((read(stream, l, sizeof l / sizeof l[0]) > 0) && 
	    (0 == strcmp(expected, l))) ? 
		SUCCESS : FAILURE;
}

ОвдС јС ΠΏΡ€Π΅Π»ΠΎΠΌ Ρ€Π΅Π΄Π° ΠΏΡ€Π°Π²Ρ™Π΅Π½ Π½Π° 60 Π·Π½Π°ΠΊΠΎΠ²Π° Ρ€Π°Π΄ΠΈ β€œΠΏΡ€Π΅Π½ΠΎΡΠΈΠ²Π΅ читљивости”. Али return ΠΌΠΎΠΆΠ΅ Π΄Π° станС Ρƒ јСдан Ρ€Π΅Π΄, који ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡƒΠ΄Π΅ ΠΊΡ€Π°Ρ›ΠΈ Π°ΠΊΠΎ β€œΠ·Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΠΌΠΎβ€ Π½Π΅ΠΊΠ° сазнања ΠΎ ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Ρƒ:

  • Максимална Π΄ΡƒΠΆΠΈΠ½Π° Ρ€Π΅Π΄Π° јС константа која ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈ
  • SUCCESS == 0 ΠΈ FAILURE == -1, ΠΊΠ°ΠΊΠΎ јС ΠΈ ΠΎΠ±ΠΈΡ‡Π°Ρ˜ Ρƒ Π¦-Ρƒ
int expect_string(int sm, char const* ex)
{
    char l[MAX_LINE_LEN];

    return ((read(sm, l, MAX_LINE_LEN) > 0) && (0 == strcmp(ex, l))) - 1;
}

Π Π΅Π΄ јС сад ΠΊΡ€Π°Ρ›ΠΈ ΠΎΠ΄ 80 Π·Π½Π°ΠΊΠΎΠ²Π°, ΡˆΡ‚ΠΎ јС Π±ΠΈΠ»ΠΎ Ρƒ Ρ€Π΅Π΄Ρƒ Ρ‡Π°ΠΊ ΠΈ Ρƒ Π΄ΠΎΠ±Π° Π”ΠžΠ‘-Π°.

Ово су ΠΈ Π΄Π°Ρ™Π΅ Π΄Π²Π° Ρ€Π΅Π΄Π° ΠΊΠΎΠ΄Π°. Од Ρ‚ΠΎΠ³Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ±Π΅Π³Π½Π΅ Π°ΠΊΠΎ смо Ρƒ јСдно-Π½ΠΈΡ‚Π½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΡƒ, ΠΏΠ° ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΠΌΠΎ ΠΏΠΎΡΡ‚ΠΎΡ˜Π΅Ρ›ΠΈ static char l[], ΠΈΠ»ΠΈ Π°ΠΊΠΎ смо спрСмни Π΄Π° ΠΆΡ‚Ρ€Π²ΡƒΡ˜Π΅ΠΌΠΎ Π»Π°ΠΊΠΎΡ›Ρƒ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π΅:

int expect_string(int sm, char const* ex, char* ln, size_t max_len)
{
    return ((read(sm, ln, max_len) > 0) && (0 == strcmp(ex, ln))) - 1;
}

Π‘Π°Π΄ корисник (онај ΠΊΠΎ ΠΏΠΎΠ·ΠΈΠ²Π°) ΠΌΠΎΡ€Π° Π΄Π° Π·Π°ΡƒΠ·ΠΌΠ΅ ниску Π·Π° Ρ€Π°Π΄Π½ΠΈ-ΠΏΠΎΠΌΠΎΡ›Π½ΠΈ Π½ΠΈΠ· (Ρ€Π΅Π΄) ΠΈ Π΄Π° прослСди Π΄ΠΈΠΌΠ΅Π½Π·ΠΈΡ˜Ρƒ β€œΠ·Π°ΡƒΠ·Π΅Ρ‚ΠΎΡΡ‚ΠΈβ€, ΡˆΡ‚ΠΎ јС ΠΌΠ°Π»ΠΎ Π½Π΅ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π½ΠΎ.

Али, ΠΈΠ°ΠΊΠΎ јС овај Ρ€Π΅Π΄ ΠΈΠΏΠ°ΠΊ Π½Π΅ΡˆΡ‚ΠΎ Π΄ΡƒΠΆΠΈ ΠΈ ΠΎΠΏΡˆΠΈΡ€Π½ΠΈΡ˜ΠΈ ΠΎΠ΄ сличног Ρƒ вишСм програмском Ρ˜Π΅Π·ΠΈΠΊΡƒ, ΠΎΠ½ ΠΎΠ±Ρ€Π°Ρ’ΡƒΡ˜Π΅ Π³Ρ€Π΅ΡˆΠΊΠ΅ ΠΈΠ·Ρ€ΠΈΡ‡ΠΈΡ‚ΠΎ (Π±Π΅Π· ΠΈΠ·ΡƒΠ΅Ρ‚Π°ΠΊΠ°, који су скупи Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°) ΠΈ Π½Π΅ Π·Π°ΡƒΠ·ΠΈΠΌΠ° ΠΈΠΊΠ°ΠΊΠ²Ρƒ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Ρƒ (са Ρ…Ρ€ΠΏΠ΅), ΡˆΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈ Π΄Π° јС Π·Π½Π°Ρ‡Π°Ρ˜Π½ΠΎ Π±Ρ€ΠΆΠΈ.

Π¦++ Ρ‚Ρ€ΠΈΠΊ са ΡƒΠΏΡƒΡ›Π΅ΡšΠ΅ΠΌ Π½Π° Π½ΠΈΠ· ΠΈ шаблоном

Π£ Π¦++ Π±ΠΈ Π±ΠΈΠ»ΠΎ ΠΎΡ‡Π΅ΠΈΠ²Π°Π½ΠΎ Π΄Π° сС користи std::string ΠΈ IOStreams, Π°Π»ΠΈ, сасвим јС Ρƒ Ρ€Π΅Π΄Ρƒ Π΄Π° сС останС β€œΠ½ΠΈΡΠΊΠΎβ€, Π°Π»ΠΈ ΠΈΠΏΠ°ΠΊ користС Π½Π΅ΠΊΠ΅ ΠΎΠ»Π°ΠΊΡˆΠΈΡ†Π΅, ΠΏΠΎΠΏΡƒΡ‚ ΠΎΠ²Π΅ која олакшава ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Ρƒ кориснику који ΠΈΠΌΠ° статички Π·Π°ΡƒΠ·Π΅Ρ‚Ρƒ ниску:

template <int N> inline
int expect_string(int sm, char const* ex, char (ln&)[N]) {
    return ((read(sm, ln, N) > 0) && (0 == strcmp(ex, ln))) - 1;
}

ΠΠ°Ρ€Π°Π²ΠΎΡƒΡ‡Π΅Π½ΠΈΡ˜Π΅

Ако сС ΠΏΠ°ΠΆΡ™Π²ΠΈΠΎ размисли ΡˆΡ‚Π° јС ΠΎΠ½ΠΎ ΡˆΡ‚ΠΎ Ρ…ΠΎΡ›Π΅ΠΌΠΎ Π΄Π° постигнСмо Ρƒ Π½Π΅ΠΊΠΎΠΌ Π¦ ΠΊΠΎΠ΄Ρƒ, ΡˆΡ‚ΠΎ јС нашСм ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ Π±ΠΈΠ»Π° ΠΎΠ±Ρ€Π°Π΄Π° Π½Π΅ΠΊΠΈΡ… ниски, ΠΌΠΎΠ³ΡƒΡ›Π΅ јС написати ΠΊΠΎΠ΄ који Ρ€Π°Π΄ΠΈ само ΠΎΠ½ΠΎ ΡˆΡ‚ΠΎ ΠΌΠΎΡ€Π°. Π’Π°ΠΊΠ°Π² ΠΊΠΎΠ΄ јС ΠΎΠ±ΠΈΡ‡Π½ΠΎ сличнС слоТСности ΠΈ ΠΎΠΏΡˆΠΈΡ€Π½ΠΎΡΡ‚ΠΈ ΠΊΠ°ΠΎ ΠΊΠΎΠ΄ који постиТС исто Ρƒ вишСм програмском Ρ˜Π΅Π·ΠΈΠΊΡƒ, Π°Π»ΠΈ јС, Π°ΠΊΠΎ јС исправно написан, Π±Ρ€ΠΆΠΈ, користи мањС рСсураса ΠΈ ΠΈΠ·Ρ€ΠΈΡ‡ΠΈΡ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ’ΡƒΡ˜Π΅ Π³Ρ€Π΅ΡˆΠΊΠ΅.

Written on January 10, 2018