리눅스 중 atoi 함수

gogoyam의 이미지

#include
#include
#include
int atoi(const char *string);
int myAdd(char *String);
int main(){
//char *argv[] ={ "/bin/ls", "-al", "/tmp", NULL};
char *argv;
printf("first word : ");
argv[0] = getchar();
getchar();
printf("second word : ");
argv[1] = getchar();
printf("%d",myAdd(argv));


// execl( "/bin/ls", "/bin/ls", "-al", "/tmp", NULL);
// execv( "/bin/ls", argv);

// printf( "이 메시지가 보이면 지정된 프로그램이 \
없거나 어떤 문제로 실행되지 못한 것입니다.\n");
}
int atoi(char const *c){

int value = 0;
int positive = 1;

if(*c == '\0')
return 0;

if(*c == '-')
positive = -1;

while(*c) {
if(*c > '0' && *c < '9')
value = value * 10 + *c - '0';
c++;
}

return value*positive;
}
int myAdd(char *String){
int x, y;
x = atoi(String);
String++;
y = atoi(String);
return x + y;
}

위와 같은 c파일을 만들었는데, 첫번째 인수만 입력되고 프로그램이 죽습니다.

first word : '1'
Segmentation fault (core dumped)

위와 같은 모습으로 죽습니다.

디버깅을 돌려보니

기능 메인에서 빠져 나올 때까지 단일 스테핑,
줄 번호 정보가 없습니다.

프로그램이 SIGSEGV 신호로 종료되었습니다. 세그먼트가 잘못되었습니다.
프로그램이 더 이상 존재하지 않습니다.

라는 오류가 나네요..ㅠㅠ

아이온@Naver의 이미지

char *argv;
포인터만 있고 메모리 할당은 되지 않았어요.

디버깅 정보가 없는 건, 컴파일 할 때 -g 옵션을 안 주신 것 같군요. 개발할 때는 -g3 -O0 를 추가로 주고 컴파일 하세요.

shint의 이미지


구름 IDE 테스트
https://ide.goorm.io

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int atoi(const char *string);
int myAdd(char *String);
 
int main()
{
 	//char *argv[] ={ "/bin/ls", "-al", "/tmp", NULL};
 
 
	//test
	int height = 6, width = 8;
	char **arr;
	arr = (char**) malloc ( sizeof(char*) * height );
	for(int i=0; i<height; i++)
	{
		arr[i] = (char*) malloc ( sizeof(char) * width );
		sprintf( arr[i], "test%d", i);
		printf("%s\n", arr[i]);
		free(arr[i]);	 
	}
	free(arr);
 
 
	//생성
	arr = (char**) malloc ( sizeof(char*) * height );
	for(int i=0; i<height; i++)
	{
		arr[i] = (char*) malloc ( sizeof(char) * width );
		sprintf( arr[i], "test%d", i);
		printf("%s\n", arr[i]);
//		free(arr[i]);	 
	}
//	free(arr);
 
	//
	printf("first word : ");
	int n = getchar();
	printf("%d %c %x\n", n, n, n);
	sprintf( arr[0], "%c", n);
	printf("arr[0] %s\n", arr[0]);
 
	//한칸 띄우기
	putchar(getchar());
 
	//
	printf("second word : ");
	n = getchar();
	sprintf( arr[1], "%c", n);
	printf("arr[0] %s\n", arr[0]);
	printf("arr[1] %s\n", arr[1]);
 
	//한칸 띄우기
	putchar(getchar());
 
	printf("arr : %s\n", *arr);
	printf("arr[0] : %s\n", arr[0]);
	printf("arr[1] : %s\n", arr[1]);
 
	//
	printf("%d", myAdd((char*)arr));
 
 
	//소멸
	for(int i=0; i<height; i++)
	{
		free(arr[i]);	 
	}
	free(arr);
 
	return 0;
 
 
 // execl( "/bin/ls", "/bin/ls", "-al", "/tmp", NULL);
 // execv( "/bin/ls", argv);
 
// printf( "이 메시지가 보이면 지정된 프로그램이 \
//없거나 어떤 문제로 실행되지 못한 것입니다.\n");
	return 0;
}
 
int atoi(char const *c)
{
	int value = 0;
	int positive = 1;
 
	if(*c == '\0')
		return 0;
 
	if(*c == '-')
		positive = -1;
 
	while(*c) 
	{
		if(*c > '0' && *c < '9')
			value = value * 10 + *c - '0';
	 	c++;
	}
	return value*positive;
}
 
int myAdd(char *String)
{
	char ** p = (char**) String;
	printf("p[0] : %s\n", p[0]);
	printf("String0 : %s\n", String);
 
 int x, y;
 x = atoi(p[0]);
	printf("x %d\n", x);
 
 String++;
 
	printf("\n");
 
	printf("p[1] : %s\n", p[1]);
	printf("String1 : %s\n", String);
 y = atoi(p[1]);
	printf("y %d\n", y);
 return x + y;
}

//출력 결과
root@goorm:/workspace/ccc/src# gcc -o m main.c
root@goorm:/workspace/ccc/src# ./m
test0
test1
test2
test3
test4
test5
test0
test1
test2
test3
test4
test5
first word : 4
52 4 34
arr[0] 4
second word : 7
arr[0] 4
arr[1] 7
arr : 4
arr[0] : 4
arr[1] : 7
p[0] : 4
String0 : P
x 4
p[1] : 7
String1 :
y 7
11

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

세벌의 이미지

atoi 함수를 일부러 만든 건가요?
표준함수를 안 쓰고?

소스코드에 들여쓰기 적용하려면
https://kldp.org/node/158191
참고하셔요.

컴파일할 때 에러와 경고를 자세히 보려면
gcc -Wall
해 보셔요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.