Napisz funkcję, która dostaje w argumencie napis i zamienia wszystkie występujące w nim małe litery na odpowiadające im duże litery.

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

int main()
{

char znak[100];
printf("Podaj napis:");
scanf(" %s",&znak);
	if(znak>95)
	  	printf("%c",znak-32);
	else
	printf("%c", znak);
	return 0;

}

Próbuję na razie ogarnąć funkcje która zamienia małe litery na duże. Moglibyście napisać co robię źle ?

3

Użyj toupper() z <ctype.h>

znak to nie znak, tylko tablica znaków, więc porównujesz wskaźnik (co zresztą kompilator powinien zauważyć i zablokować kompilację). Zamiast tego porównaj każdy znak.

4

dodaj flagi -Wall -Werror a kompilator wykryje ci poważny błąd.

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{
    char znak[100];
    int i;
    int len;
    printf("Podaj napis:");
    scanf("%s",znak);
    
    len = strlen(znak);

    for (i = 0; i < len; i++)
        znak[i] = toupper(znak[i]);

    return 0;
}

PS.

znak jest tablicą, więc wskaźnikiem, więc przechowuje adres, więc nie trzeba pisać &znak w scanf tylko zwykłe znak.
Dodatkowo trzeba odwoływać się do kolejnych liter

0

Użyj
scanf("%99s",znak);
w przeciwnym wypadku może nastąpić mazanie po pamięci.

0
#include <stdio.h>

#define AsStr(x) #x
#define ToStr(x) AsStr(x)

#define MaxCharCount 99
#define TableSize (MaxCharCount+1)
#define ScanFormat " %" ToStr(MaxCharCount) "[^\n]"

int main()
{
	char znak[TableSize];
	printf("Used format =\"%s\"\n",ScanFormat);
	scanf(ScanFormat,znak);
	printf("<%s>\n",znak);
	scanf(ScanFormat,znak);
	printf("<%s>\n",znak);
	return 0;
}
2

Podobnie jak @mpaw: tyle, że w funkcji:

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

char * toUpper(char * str) {
  int i = 0;
  while (str[i]) {
    str[i] = toupper(str[i]);
    i++;
  }
  return str;
}

int main(void) {
  char str[] = "ac dc";
  puts(toUpper(str));  // -> AC DC
  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1