Odczytywanie argumentów z funkcji main.

0

Witam mam program kalkulator bitowy który pobiera wartości argumentów funkcji main. Niestety podczas odpalania na ubuntu mam bład: "[1]+ Naruszenie ochrony pamięci (zrzut pamięci) ./a.out 100 220". Program odpalam w terminalu "gcc nazwa.c" następnie "./a.out 100 220 &". Może mi ktoś wyjaśnić dlaczego tak sie dzieje ?

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

int zamiana(int x);
int main(int argc, char **argv)
{
int a,b,c;
a = atoi(argv[1]);
b = atoi(argv[2]);
printf("twoja pierwsza liczba to: %d\n",a);
zamiana(a);
printf("Twoja druga liczba to: %d\n",b);
zamiana(b);
switch(argv[3][0])
{
case '~':
{
a=(~a);
b=(~b);
zamiana(a);
zamiana(b);
break;
}
case '&':
{
c=a&b;
zamiana(c);
break;
}
case '|':
{
c=a|b;
zamiana(c);
break;
}
case '^':
{
c=a^b;
zamiana(c);
break;
}
default:
{
printf("podales zly operator\n");
break;
}
}
return 0;
}

int zamiana(int x)
{
	int i;
	char tab[32];
	printf("Twoja liczba po zamianie na bity to: ");
	for (i = 31; i >= 0; i--)
	{
	tab[i] = ((x >> i) & 1);
	printf("%d", tab[i]);
	}
	printf("\n");
}
2
Problem jest dość zabawny, mianowicie &, | oraz ~ to specjalne znaki w Bashu:
& - uruchomienie procesu w tle
| - przekierowanie standardowego wyjścia aplikacji na standardowe wyjście kolejnej aplikacji
~ - katalog domowy

Więc jak uruchamiasz ./a.out 100 200 &, to dla Basha znaczy ./a.out 100 200 uruchomione w tle (jak widzisz trzeci parametr znikł). Aplikacja dostaje więc jedynie dwa parametry i przy switch(argv[3][0]) leci wspomniany przez Ciebie błąd.

Wystarczy, że "wyescapujesz" ten parametr podczas uruchomienia i wszystko będzie OK, tzn:
./a.out 100 200 \&
albo
./a.out 100 200 '&'
(analogicznie z pozostałymi znakami)

Dodam, że pod Windowsem jest podobnie, ale nie ma potrzeby escape'owania ~. Ale, znakiem ucieczki jest tam ^ a nie \, więc będzie to ^&, ^| lub ^^ ;)
1
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Nie używaj bezmyślnie postinkrementacji oraz postdekrementacji również: http://4programmers.net/Forum/1101404
  3. Nie sprawdzasz czy podano trzy argumenty
  4. Powiedz którego słowa nie zrozumiałeś w tym http://4programmers.net/Forum/1209589 poście?
1

@_13th_Dragon ja bym dodał do tego kolejny punkt.

  • Nie użyłeś debuggera.

Żeby kolega uruchomił program pod debuggerem natychmiast by było jasne co jest nie tak.

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