초기 네이버 기록/과거 공부 기록

공부기록 문자열 (씹어먹는 C언어)(scanf함수에서 띄어쓰기 해결 ,화면 출력함수 변환문자 제어문자)

뜨거운 개발자 2023. 1. 7. 01:33
/*문자열에 들어 있는 문자의 개수를 세는 일이 많을 것 입니다. 이를 수행하는 함수를 만들어 봅시다. */

#include <stdio.h>
int word_num(char *arr,int *n);//배열, 문자열 숫자
int main() {
	int n;
	char word[] = { "long sentence" };

	printf("%s \n", word);
	word_num(word, &n);
	
	printf("문자열의 개수는:%d", n);
	return 0;
}
int word_num(char* arr, int* n) {
	for (int i = 0;; i++) {
		if (arr[i] == 0) {
			*n = i+1;
			return 0;
		}
	}

}
/* char *str="abcdefghi" 과 char c_str[] = { "abcdefghi" };의 차이점 */
#include <stdio.h>
int main() {
	char c_str[] = { "abcdefghi" };
	const char* str = "abcdefghi";
	printf("%s\n", str); /* 하면 잘 출력된다.*/
	printf("%c\n", str[10]);
	printf("%s\n", c_str); 
	printf("%c\n",c_str[10]);
	return 0;
/*결국 두개의 차이점은 str은 계속해서 뒤에 \0이 오는데 반해 
c_str은 마지막에만 \0을 넣고 사라진다. 
즉 저렇게 포인터 형태로 만들어 버리면
배열의 크기가 자료형의 크기와 같아진다라고 나는 생각한다. 
정답이 아닐수 있음*/
}
/* 두 개의 문자열을 비교하는 함수를 만들어서 같으면 1, 다르면 0 을 리턴하게 해보세요. (난이도 : 中)*/
#include<stdio.h>
int str_compare(char* arr1, char* arr2);
int main() {
	char arr1[30];
	char arr2[30];
	printf("비교할 첫번째 문자열을 입력하시오");
	scanf("%s", arr1);
	printf("비교할 두번째 문자열을 입력하시오");
	scanf("%s", arr2);
	str_compare(arr1, arr2);
	return 0;

}
int str_compare(char* arr1, char* arr2) {
	for (int i = 0; i < 30; i++) {
		if (arr1[i] == arr2[i]) {
			continue;
		}
		else {
			printf("같은 문자열이 아닙니다.\n ");
			return 0;
		}
	}
	printf("같은 문자열 입니다.\n");
	return 0;
}

 

kbhit 함수와 getch함수 예제로 정리

#include<stdio.h>
#include<conio.h>
int main() {
	int key;
	int i = 0;
	while (1) {
		if (kbhit()) {
			key = getch();
			if(key==224||key==0)
				{
				key = getch();
				switch (key) {
				case 72:
					printf("↑\n");
					break;
				case 75:
					printf("←\n");
					break;
				case 77:
					printf("→\n");
					break;
				case 80:
					printf("↓\n");
					break;
				default:
					break;
				}
			}
			else {
				if (key == 13)
					printf("enter?");
				else if (key >= 65 && key <= 90)
					printf("영어 대문자 누름");
				else if (key >= 97 && key <= 122)
					printf("영어 소문자 누름");
				else if (key >= 48 && key <= 57)
					printf("숫자 키 누름");
				else
					printf("몰라요");


			}
		}

	}
	return 0;
}//

scanf함수에서 띄어쓰기 해결

#include <stdio.h>
int main() {
	char str1[10], str2[10];

	printf("문자열을 입력하세요 : ");
	scanf("%[^\n]", str1);
	printf("입력한 문자열 : %s \n", str1);

	printf("문자열을 입력하세요 : ");
	scanf(" %[^\n]", str2);//두번째 입력에는 %[^\n]앞에 띄어쓰기를 해준다
	printf("입력한 문자열 : %s \n", str2);
//앞에 공백을 추가해주면 white space를
// 두 입력을 구분하는 구분자로 인식해서 그냥 넘어가지 않습니다.
	return 0;
}//띄어쓰기는 위 처럼 할 수 있고

화면 출력함수 변환문자 제어문자

 

1. putc() [ int putc(int c, FILE *stream) ] in stdio.h

한 문자를 출력하는 함수

첫번째 인자 : 출력할 문자

두번째 인자 : 출력할 위치

 

2. putchar() [ int putchar (int character) ] in stdio.h

이 함수는 stdio헤더 파일에 매크로로 정의되어 있다.

#define putchar(c) putc((c),stdout)

putc함수를 표준출력으로만 이용할 수 있게 만든 것이 함수는 문자 c를 되돌주고(리턴), 에러가 발생하면 EOF(-1)을 리턴

 

3. puts() [ int puts(const char*s) ] in stdio.h

Put String, 문장 출력함수다. 컴퓨터의 특성상 문장에 변화를 주기 어렵기 때문에 문자상수를 인자로 갖는다. 인자에는 문장을 집어 넣어도 되고, 문장의 첫 부분을 가리키는 포인터나 배열이 사용되기도 한다.

puts는 자동으로 문장의 끝에 \n문자(개행문자)를 삽입해준다. 자동으로 줄바꿈이 이루어진다는 뜻이다

 

 

변환문자

 

%o / %O 8진수로 출력

%d 10진수로 출력

%x / %X 16진수로 출력

%u unsigned형식으로 출력

%i int형식으로 출력

%f float형식으로 출력

%lf double형식으로 출력

%e / %E 지수형식으로 출력

%s 문장으로 출력

%c 문자로 출력

%p 지정된 변수의 주소를 출력한다.

 

%(자연수)(영문자) 숫자만큼의 칸을 차지하여 출력한다.

%-(영문자) 왼쪽 정렬한다. ( 오른쪽 정렬이 기본형식이다. )

%+(영문자) 숫자 출력시에 쓰이며, 부호를 출력한다.

%.(자연수)(영문자) 실수 출력시에 쓰이며, 소수점 이하 (자연수)자리만큼 출력한다.

%0(영문자) 출력하고 남은 왼쪽칸을 0으로 채운다.

 

제어문자 (escape문자)

변환문자는 \ + (문자) 로 구성되어 있다.

 

\n 줄을 바꾼다( 개행문자 )

\r 줄의 처음으로 간다.

\b 커서를 왼쪽으로 한칸 옮긴다.

\a 비프음을 출력한다.

\t 탭을 출력한다.

 

 

 

/*문자열을 합치는 함수 
이 함수는 문자열 두개를 받으면 그 두개를 이어서 출력하는 함수이다. 
리턴은 제대로 했을때 1이 나오도록 만들어본다.
함수의 인자로는 문자열 2개를 포인터로 입력 받아야한다.
*/
#include<stdio.h>
int str_attach(char* str1, char* str2);
int main() {
	char str1[100] = { "hello my name is:" };
	char str2[100] = { "shin joung eun" };
	if (str_attach(str1,str2) == 1)
		printf("성공");
	else printf("실패");
	return 0;
}
str_attach(char* str1, char* str2) {
	for (int i = 0; i < 100; i++) {
		if (str1[i] == 0) {
			for (int i2 = 0; i2 < 100; i2++) {
				str1[i + i2] = str2[i2];
				if (str2[i2] == 0) {
					printf("%s", str1);
					return 1;
				}
			}
		}
	}
}

슬슬 끝이 보인다. 라피신 합격을 위해서 이정도는 기초로 잡고 가야하니까 조금만 더 힘내자!! 아자아자

 

/*문자열을 복사하는 함수 
주소값에 1을 더하면 다음 배열로 넘어가는 성질과 while문을 활용해서 풀어보자
어떤 함수:문자열 두개를 동일하게 만드는 함수 즉 문자열 두개를 받아서 첫번째 문자열이 
더 길다고 조건을 걸고 두번째 문자열과 첫번째 문자열을 같게 만든다. 
리턴형은 그냥 리턴 0을 하도록 하자. 
인자로 무엇을 받는가?: char형 배열을 포인터로 2개 받는다.

*/
#include <stdio.h>
int copy_str(char* str1, char* str2);
int main() {
	char str1[] = { "123456789012345678901234567890" };//30개의 문자열
	char str2[30];
	printf("문자를 입력하시오 (최대 길이는 30 입니다");
	scanf("%s", str2);
	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	copy_str(str1, str2);
	printf("str1:%s\n",str1);
	printf("str2:%s\n", str2);
	return 0;
	
}
int copy_str(char* str1, char* str2) {
	while (*str2) {
		*str1 = *str2;
		str1++;
		str2++;
	}
	*str1 = '\0';
	return 0;
}
/*문자열 내의 총 문자의 수를 세는 함수
함수가 하는일: 문자열을 받아서 이 문자열의 총 문자 숫자를 세는 것. 단 
띄어쓰기랑 엔터는 숫자에 안 포함되도록 주의하자.
리턴값: 총문자의 숫자를 리턴해주자.
받아야하는 인자: char 형 문자열을 포인터로 받아야한다. 
*/
#include<stdio.h>
int languege_num(char* str);
int main(){
	char str[100] = {0};
	int num;
	printf("write the any word: ");
	scanf("%[^\n]",str);
	num = languege_num(str);
	printf("문자열에서 문자의 숫자는%d", num);
	return 0;

}

int languege_num(char* str) {
	int num = 0;
	while (*str) {
		if (*str == ' ') {
			str++;
			continue;
		}
		
		str++;
		num++;
	}
	
	return num;

}//호호 기분좋다
/*문자열을 비교하는 함수 
함수가 하는일: 문자열의 길이가 같은지 문자열의 구성요소들이 하나하나 같은지를 비교하는 함수이다. 
리턴값: 0을 리턴하고 함수에서 정답을 말한다.
인자: 문자열 두개를 인자로 받아야한다.
*/
#include <stdio.h>
int compare(char* str1, char* str2);
int main() {
	int str1[] = {"hello word"};
	int str2[] = { "hello" };
	
	compare(str1, str2);
	return 0;
}
	
int compare(char* str1, char* str2) {
	while (*str1) {
		if (*str1 == *str2) {
			str1++;
			str2++;
		}
		else {
			printf("이 문자열은 같지 않습니다.");
			return 0;
		}
	}
	if (*str2 == 0) {
		printf("이 문자열은 길이마저 똑같군요");

	}
	else {
		printf("안타깝게도 길이는 다르군요");
	}
	return 0;
}
728x90