문자열 뒤에 문자를 추가하는 방법은 없나요..?

익명 사용자의 이미지

void main()

{
char *pt[2];
char a[2][3]={1,2,3,4,5,6};

pt[0]= (char*)calloc(sizeof(char),100);
pt[1]= (char*)malloc(sizeof(char)*100);
pt[0]="가나다";
printf("%d\n",strlen(pt[0])); //6
printf("%s\n",pt[0][6]); // null

pt[0][strlen(pt[0])] = '.';
pt[0][strlen(pt[0])+1] ='\0' ;

printf("%s\n",pt[0][6]);
}
이런식으로 해서 가다나뒤에 . 을 추가해주고싶은데 되질않네요... 머가잘못된걸까요?

raymundo의 이미지

1. 코드는 < code > 태그로 감싸주세요.

2. 답이 안 달린다고 몇 시간만에 새 글을 쓰셔봤자 다 첫화면에 그대로 있습니다

pt[0]= (char*)calloc(sizeof(char),100);
// 열심히 calloc 으로 할당받은 공간의 주소를 pt[0]에 대입해놓고는
 
pt[0]="가나다";
// 이렇게 하는 순간 "가나다"라는 문자열이 저장된 공간의 시작 주소가 pt[0]에 대입되고
// calloc으로 확보했던 공간은 더 이상 접근할 방법이 없어서 쓸 수 없게 되며
 
pt[0][strlen(pt[0])] = '.';
// 설상가상으로 "가나다"같이 코드 내에 문자열 리터럴로 적은 데이터는 보통은 읽기 전용 영역에
// 저장되기 때문에, 거기에 가서 이렇게 저장된 값을 바꾸려고 하면 프로그램이 죽습니다.

calloc으로 할당받는 공간에 "가나다"라는 문자열을 기록하고 싶다면 strcpy() 함수를 쓰세요.
그 뒤에 다른 문자열을 덧붙이는 건 strcat() 함수가 있습니다.

좋은 하루 되세요!

익명 사용자의 이미지

원래 대로는 scanf 로 가나다를 입력받아서 저기에 저장하는건데 scanf(%s,ptr[0]); 이런식으르오요 이때도 그냥
strcat쓰면 되겠죠?

 의 이미지

strcat이 일반적으로 좋은 해결책입니다.
다만 Schlemiel the Painter's algorithm을 구현하지 않도록 주의하세요.

https://en.wikipedia.org/wiki/Joel_Spolsky#Schlemiel_the_Painter.27s_algorithm

그리고 아래 코드는 일반적으로 동작하지 않습니다. strlen함수는 NUL 문자를 찾는 방식으로 동작한다는 걸 숙지하시고 다시 보세요.

pt[0][strlen(pt[0])] = '.';
pt[0][strlen(pt[0])+1] ='\0' ;
익명 사용자의 이미지

int i;
 
 
	char *pt[2];
	char a[2][3]={1,2,3,4,5,6};
 
	pt[0]= (char*)calloc(sizeof(char),100);
	pt[1]= (char*)malloc(sizeof(char)*100);
	printf("입력 : ");
	scanf("%s",pt[0]);
	//pt[1]=pt[0];
	//printf("%c\n",pt[0][1]);
 
	//printf("%d\n",strlen(pt[0]));
	pt[0][6] = '.';
	pt[0][7] ='\0' ;
 
	printf("%s\n",pt[0]);
<code>
이렇게 하니까 정상 작동되네요
익명 사용자의 이미지

그니까 위에 .이 연결된후에는 널이 없어지니까 아래서 널값을 찾질못하니 strlen이 정상작동되지않겠군요!
그리고 스캐미컬 내용도 읽어봤는데 시스템동작에러가 아니라 속도가 점점 늘어진다는걸로 이해했는데 맞나요?

zestors의 이미지

abc, def, ghi 를 concat 한다고 생각해보세요.
1. abc의 끝을 알기 위해 맨 처음 위치(a)로 가서 길이를 알아낸다(3)
2. 알아낸 길이 값을 사용하여 def를 뒤에 붙인다.
3. ghi를 붙이기 위해 이전 버퍼의 끝을 알기 위해 다시 맨 처음위치(a)로 가서 길이를 알아낸다(6)
4. 알아낸 길이 값을 사용하여 ghi를 붙인다.

concat 해야할 문자열의 갯수가 늘어날 수록 길이값을 알아오는 연산도 점차 늘면서 배보다 배꼽이 커지게됩니다

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.