Jump to content

Archived

This topic is now archived and is closed to further replies.

repta2

C- problem z tablicą

Recommended Posts

 

	#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
	int main(int argc, string argv[])
{
    
    if (argc > 2 || argc < 1)
        {
            printf("Error");
            return 1;
        }
    
    int k = atoi(argv[1]);
    string text = GetString();
 
    
    
    for (int i = 0; i< strlen(text); i++)
    {
        
        if(text[i]>64 && text[i] <91)
        {
             text[i] = text[i] + k;
             if(text[i] > 90)
                {
                    int zmienna = 64 + (text[i] - 90);
                    text[i] = zmienna;
                }
             printf("%c", text[i]);
        }
        
        else if (text[i]>96 && text[i]<123)
        {
                printf("%i\n", text[i]);
                text[i] = text[i] + k;
                printf("%i", text[i]);
               
               if(text[i] > 122)
                {
                    int zmienna = 96 + (text[i] - 122);
                    text[i] = zmienna;
                    
                }
            printf("%c", text[i]);
                
        }
        
        else
            printf("%c", text[i]);
            
    }
    printf("\n");    
    
}
	 
	

 

Generalnie program, ma kodować tekst i problem polega na tym, że przy dużych literach wszystko jest ok, a przy małych robi się problem, znalazłem takowy w tej linijce


printf("%i\n", text[i]);
text[i] = text[i] + k;
printf("%i", text[i]);
	

Problem polega na tym, że jak wpisuję np małe s-kod ASCII 115 to po dodaniu do tej wartości k (np 13) daje mi -128, wygląda to tak jakbym obracał się poza zakresem tablicy?? Jak wprowadzam małą literę koduję też na małą literę. Program pewnie wykonam w inny sposób ale chciałbym się dowiedzieć na czym polega błąd i jak go w przyszłości unikać.

 

Biblioteka cs50-> to bliblioteka kursu CS50, są tam takie funkcje jak np GetString

Link to comment
Share on other sites

Zakres wartości typu char to [-128, 127], więc wszystko działa jak najbardziej poprawnie (i nawiasem mówiąc nie ma to nic wspólnego z tablicą). Jeżeli z jakiegoś powodu chciałbyś uzyskać nieujemne wartości liczbowe, możesz rzutować wartość np. na typ unsigned char.

Tak swoją drogą, jakkolwiek podziwiam, że odnajdujesz się w liczbowych wartościach poszczególnych znaków, to jednak kod zyskałby chyba na czytelności, gdybyś podmienił je na normalne znaki, np.

if (text[i]>='A' && text[i] <='Z')

 

Link to comment
Share on other sites

12 godzin temu, webtom napisał:

Zakres wartości typu char to [-128, 127]

Char to, zgodnie z §3.6 oraz §3.7.1 standardu, bajt. Bajt natomiast nie musi mieć 8 bitów, więc to nie jest do końca prawda. Po prostu w przypadku tej architektury (i w sumie wielu innych) tak się złożyło, że będzie to 8 bitów.

 

Co więcej obliczanie wartości strlen(text) w pętli, przy każdym obrocie, może nie być optymalne.

Link to comment
Share on other sites

24 minuty temu, Hakken napisał:

Char to, zgodnie z §3.6 oraz §3.7.1 standardu, bajt.

A tak przypadkiem char nie musi się składać z przynajmniej 8 bitów, przez co powyższe stwierdzenie również byłoby nie do końca poprawne? :>

28 minut temu, Hakken napisał:

Co więcej obliczanie wartości strlen(text) w pętli, przy każdym obrocie, może nie być optymalne.

Zakładając, że autor nie zna jeszcze instrukcji break (i wyrażenia warunkowego), to dla zachowania obecnej funkcjonalności raczej nie da się tego zapisać lepiej ;)

Link to comment
Share on other sites

3 minuty temu, webtom napisał:

A tak przypadkiem char nie musi się składać z przynajmniej 8 bitów, przez co powyższe stwierdzenie również byłoby nie do końca poprawne? :>

Zakładając, że autor nie zna jeszcze instrukcji break (i wyrażenia warunkowego), to dla zachowania obecnej funkcjonalności raczej nie da się tego zapisać lepiej ;)

1. §3.6: 

byte
addressable unit of data storage large enough to hold any member of the basic character set of the execution environment  
NOTE 1 It is possible to express the address of each individual byte of an object uniquely.
NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementationdefined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit

2.

size_t size = strlen(text) ; for(i = 0; i < size; ++i) { ... }


Tutaj też możnaby się pochylić nad pytaniem czy strlen obsługuje typ string, i czy nie należy się zainteresować funkcją strnlen dla bezpieczeństwa.

Link to comment
Share on other sites

1. Hmmm

Cytat

5.2.4.2.1 Sizes of integer types
(...)
305 Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
(...)
307 —  number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8

2. Przy takich założeniach, jakie poczyniłeś, nie byłoby lepiej zapisać tak?

for(i = 0; text[i]; ++i) { ... }

I raczej chodziło mi o coś innego - dla:

k = 191 // (-'A' + 256)
text = "ABC..Z"

Twój zapis spowoduje uzyskanie innego rezultatu (a że będzie miał więcej sensu, to już inna sprawa).

Link to comment
Share on other sites

1. Tak, dlatego właśnie stwierdzenie o przedziale wartości [-128, 127] jest nie do końca precyzyjne. Po pierwsze char może być szerszy, a po drugie standard nie precyzuje czy typ char jest ze znakiem czy bez - więc obecność ujemnych liczb nie jest oczywista.

2. Jeżeli byśmy zmieniali text to faktycznie będzie się zachowywało inaczej. Tak czy inaczej chodzi o nie wywoływanie tej samej funkcji wielokrotnie jeśli to zbędne.

// Dobra, już więcej nie męczę. Dzięki za poszerzenie horyzontów [webtom]

Link to comment
Share on other sites



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...