Aulas de C para quem já sabe Python

Aprendendo C depois de aprender Python

005 - Strings

Arquivos necessários

Baixe todos os programas aqui.

Configuração do VSCode

Idênticas as da aula 4, incluídas no zip desta aula.

Python

string1.py

s = "Olá Strings!"
print(s)

string2.py

s = "Olá Strings!"
print(s)
print(f"Tamanho: {len(s)}")
for c in s:
    print(c)

string5.py

s = "bola"
v = "bicicleta"
b = "ave"

print("bola > bicicleta?", s > v)
print("bicicleta < bola?", v < s)
print("bola > ave?", s < b)
print("bola == bola?", s == b)

print("A partir do primeiro l de bola: ", s[s.find("l") :])
print("A partir do primeiro o de bola: ", s[s.find("o") :])
print("A partir do primeiro x de bola: ", s[s.find("x") :])

v = s[:]

print("Valor de v: ", v)

# v[0] = "s"
v = "s" + v[1:]
print("Valor de s: ", s)
print("Valor de v: ", v)

roupa = "a roupa do rei de roma"
print("A partir de roupa:", roupa[roupa.find("roupa") :])
print("A partir de do:", roupa[roupa.find("do") :])
print("A partir de rei:", roupa[roupa.find("rei") :])

string6.py

s = "bola,casa,madeira"
for p in s.split(","):
    print(p)

string7.py

s = "o rato roeu a roupa"

print(s.replace(" ", ""))

forca.py

https://python.nilo.pro.br/listagem4/capitulo%2007/listagem-07-02.html

##############################################################################
# Parte do livro Introdução à Programação com Python
# Autor: Nilo Ney Coutinho Menezes
# Editora Novatec (c) 2010-2024
# Quarta Edição - Março/2024 - ISBN 978-85-7522-886-9
#
# Site: https://python.nilo.pro.br/
# https://python.nilo.pro.br/listagem4/capitulo%2007/listagem-07-02.html
#
# Arquivo: capítulo 07/07.02 - Jogo da forca.py
##############################################################################
palavra = input("Digite a palavra secreta:").lower().strip()
for x in range(100):
    print()
digitadas = []
acertos = []
erros = 0
while True:
    senha = ""
    for letra in palavra:
        senha += letra if letra in acertos else "."
    print(senha)
    if senha == palavra:
        print("Você acertou!")
        break
    tentativa = input("\nDigite uma letra:").lower().strip()
    if tentativa in digitadas:
        print("Você já tentou esta letra!")
        continue
    else:
        digitadas += tentativa
        if tentativa in palavra:
            acertos += tentativa
        else:
            erros += 1
            print("Você errou!")
    print("X==:==\nX  :  ")
    print("X  O  " if erros >= 1 else "X")
    linha2 = ""
    if erros == 2:
        linha2 = "  |  "
    elif erros == 3:
        linha2 = " \|  "
    elif erros >= 4:
        linha2 = " \|/ "
    print(f"X{linha2}")
    linha3 = ""
    if erros == 5:
        linha3 += " /   "
    elif erros >= 6:
        linha3 += " / \ "
    print(f"X{linha3}")
    print("X\n===========")
    if erros == 6:
        print("Enforcado!")
        break

C

string1.c

#include <stdio.h>

int main(void)
{
    char s[] = "Ola Strings!";
    printf("%s\n", s);
}

string2.c

#include <stdio.h>
#include <string.h>

int main(void)
{
    char s[] = "Ola Strings!";
    printf("%s\n", s);
    printf("Tamanho com strlen: %lld\n", strlen(s));
    printf("Tamanho com sizeof: %zu\n", sizeof(s));

    puts("Com For 1:");
    for (unsigned int i = 0; i < strlen(s); i++)
    {
        printf("%c\n", s[i]);
    }

    puts("Com while:");
    unsigned int p = 0;
    while (s[p])
    {
        printf("%c\n", s[p++]);
    }

    puts("Com For 2:");
    for (unsigned int i = 0; s[i]; i++)
    {
        printf("%c\n", s[i]);
    }
}

string3.c

#include <stdio.h>
#include <string.h>

// Tamanho da string x memória
int main(void)
{
    char s[] = "Ola Strings!";
    char v[30] = {0};
    char b[30] = {'a', 'l', 'o', 0}; // = "alo"

    printf("s = %s\n", s);
    printf("v = %s\n", v);
    printf("b = %s\n", b);
    printf("Tamanho strlen de v = %lld\n", strlen(v));
    printf("Tamanho sizeof de v = %zu\n\n\n", sizeof(v));

    strcat(v, s);
    printf("Depois do strcat com s: v = %s\n", v);
    strcat(v, b);
    printf("Depois do strcat com b: v = %s\n", v);
    printf("Tamanho strlen de v = %lld\n", strlen(v));
    printf("Tamanho sizeof de v = %zu\n", sizeof(v));
    puts("Buffer Overflow");
    strcat(v, s);
    strcat(v, s);
    printf("Tamanho strlen de v = %lld\n", strlen(v));
    printf("Tamanho sizeof de v = %zu\n", sizeof(v));
    // Segmentation fault
    // strcat(v, s);
    // strcat(v, s);
}

string4.c

#include <stdio.h>
#include <string.h>

// Procurando caracteres e strings
int main(void)
{            // 0123 &s[2]
    char s[] = "bola";

    printf("A partir do primeiro l de bola: %s\n", strchr(s, 'l'));
    printf("A partir do primeiro o de bola: %s\n", strchr(s, 'o'));
    printf("A partir do primeiro x de bola: %s\n", strchr(s, 'x'));

    s[0] = 'c';
    printf("Novo valor de s: %s\n", s);

    char v[30];

    strcpy(v, s);
    printf("Valor de v: %s\n\n", v);

    v[0] = 's';
    printf("Valor de s: %s\n", s);
    printf("Valor de v: %s\n", v);
}

string5.c

#include <stdio.h>
#include <string.h>

// Comparando
int main(void)
{
    char s[] = "bola";
    char v[] = "bicicleta";
    char b[] = "ave";

    printf("bola strcmp bicicleta: %d (>)\n", strcmp(s, v));
    printf("bicicleta strcmp bola: %d (<)\n", strcmp(v, s));
    printf("bola strcmp ave: %d (>)\n", strcmp(s, b));
    printf("bola strcmp bola: %d (==)\n\n\n", strcmp(s, s));
    
    // Erro de compilacao
    // printf("bola == bicicleta: %d\n", s == v);
    // printf("bicicleta < bola: %d\n", v < s);
    // printf("bola > ave: %d\n", s > b);
    // printf("bola == bola: %d\n", s == s);

    printf("A partir de roupa: %s\n", strstr("a roupa do rei de roma", "roupa"));
    printf("A partir de do: %s\n", strstr("a roupa do rei de roma", "do"));
    printf("A partir de rei: %s\n", strstr("a roupa do rei de roma", "rei"));
}

string6.c

#include <stdio.h>
#include <string.h>

// Separando por ,
int main(void)
{
    char s[] = "bola,casa,madeira";

    for (int i = 0; s[i]; i++)
    {
        if (s[i] != ',')
        {
            printf("%c", s[i]);
        }
        else
        {
            puts("");
        }
    }
    puts("");
}

string7.c

#include <stdio.h>
#include <string.h>

// Retirando espaços de uma string
int main(void)
{
    char s[] = "o rato roeu a roupa";
    char v[30] = {0};
    int z = 0;

    for (int i = 0; s[i]; i++)
    {
        if (s[i] != ' ')
        {
            v[z++] = s[i];
        }
    }
    // v[z] = 0;
    printf("V (s sem espaços): %s\n", v);
}

string8.c

#include <stdio.h>
#include <string.h>

void le_string(char destino[])
{
    scanf("%s", destino);
}

// Lendo Strings
// 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
int main(void)
{
    char s[50];
    char v[50];
    printf("Digite algo:\n");
    le_string(s);
    printf("Digite outra coisa:\n");
    le_string(v);
    printf("Algo: %s\n", s);
    printf("Outra coisa: %s\n", v);
}

string9.c

#include <stdio.h>
#include <string.h>

void le_string(char destino[], int max)
{
    fgets(destino, max, stdin);
}

// Lendo Strings
int main(void)
{
    const int MAX = 50;    
    char s[MAX];
    char v[MAX];
    printf("Digite algo:\n");
    le_string(s, MAX);
    printf("Digite outra coisa:\n");
    le_string(v, MAX);
    printf("Algo: %s\n", s);
    printf("Outra coisa: %s\n", v);
    printf("strlen: %lld\n", strlen(v));
}

stringA.c

#include <stdio.h>
#include <string.h>

void le_string(char destino[], int max)
{
    do
    {
        fgets(destino, max, stdin);
        char *p = strchr(destino, '\n');
        if (p != nullptr)
        {
            *p = 0;
            break;
        }
        char u;
        do
        {
            u = fgetc(stdin);
        } while (u != 0 && u != '\n');
        printf("Não há espaço para lermos tantos caracteres (max=%d)\n", max);
        printf("Por favor redigite:\n");
    } while (true);
}
// 12345678901234567890123456789012345678901234567890
// Lendo Strings
int main(void)
{
    const int MAX = 50;
    char s[MAX];
    char v[MAX];
    printf("Digite algo:\n");
    le_string(s, MAX);
    printf("Digite outra coisa:\n");
    le_string(v, MAX);
    printf("\nAlgo: %s\n", s);
    printf("strlen(s): %lld\n", strlen(s));
    printf("Outra coisa: %s\n", v);
    printf("strlen(v): %lld\n", strlen(v));
}

forca.c

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>

void le_string(char destino[], int max)
{
    do
    {
        fgets(destino, max, stdin);
        char *p = strchr(destino, '\n');
        if (p != nullptr)
        {
            *p = 0;
            break;
        }
        char u;
        do
        {
            u = fgetc(stdin);
        } while (u != 0 && u != '\n');
        printf("Não há espaço para lermos tantos caracteres (max=%d)\n", max);
        printf("Por favor redigite:\n");
    } while (true);
}

void lower(char m[])
{
    for (char *p = m; *p; p++)
    {
        *p = tolower(*p);
    }
}

void lstrip(char m[])
{
    int mlen = strlen(m);
    int i;
    for (i = 0; m[i] == ' ' && i < mlen; i++)
        ;
    if (i == mlen)
    {
        m[0] = 0;
        return;
    }
    for (int z = 0; i < mlen; i++)
    {
        m[z++] = m[i];
    }
}

void rstrip(char m[])
{
    int fim = strlen(m) - 1;
    if (fim <= 0)
        return;
    for (; m[fim] == ' ' && fim >= 0; fim--)
        ;
    if (fim > 0)
        m[++fim] = 0;      
}

void strip(char m[])
{
    lstrip(m);
    rstrip(m);
}

// Jogo da forca
int main(void)
{
    const int MAX = 100;
    char palavra[MAX] = {};
    puts("Digite a palavra secreta:");
    le_string(palavra, MAX);
    lower(palavra);
    strip(palavra);
    for (int x = 0; x < 200; x++)
    {
        puts("");
    }
    char digitadas[MAX] = {};
    char acertos[MAX] = {};
    int erros = 0;
    int lpalavra = strlen(palavra);
    while (true)
    {
        char senha[MAX] = {};
        for (int p = 0; p < lpalavra; p++)
        {
            senha[p] = (strchr(acertos, palavra[p])) ? palavra[p] : '.';
        }
        puts(senha);
        if (strcmp(senha, palavra) == 0)
        {
            puts("Você acertou!");
            break;
        }
        char tentativa[3] = {};
        puts("\nDigite uma letra:");
        le_string(tentativa, 3);
        lower(tentativa);        
        if (strchr(digitadas, tentativa[0]) != 0)
        {
            puts("Você já tentou essa letra!");
            continue;
        }
        else
        {
            strcat(digitadas, tentativa);
            if (strchr(palavra, tentativa[0]) != 0)
            {
                strcat(acertos, tentativa);
            }
            else
            {
                erros++;
                puts("Você errou!");
            }
        }
        // Imprime o enforcado
        puts("X==:==\nX  :  ");
        puts(erros >= 1 ? "X  O  " : "X");
        // Linha 2
        if (erros == 2)
            puts("X  |  ");
        else if (erros == 3)
            puts("X \\|  ");
        else if (erros >= 4)
            puts("X \\|/ ");
        else
            puts("X");
        // Linha 3
        if (erros < 5)
            puts("X");
        else if (erros == 5)
            puts("X /   ");
        else if (erros >= 6)
            puts("X / \\ ");

        puts("X\n===========");
        if (erros == 6)
        {
            puts("Enforcado!\n");
            break;
        }
    }
}

Videos

Linguagem C para quem já programa em Python - Aula 5

Parte 1 - Como funcionam as strings em C, como usá-las e alguns cuidados a tomar

Parte 2 - strcpy, strstr, scanf com strings, fgets

Parte 3 - fgetc, strlwr, tolower, jogo da forca

Assine o canal para não perder os novos vídeos

https://www.youtube.com/channel/UCLwVwuuS7VpVOGF-SAJp_JQ