char str[100];
scanf("%s",str);
printf("%s",str);
보이지 진은아 문자열 변수는 &연사자 사용안하는 거
그리고 공백을 포함해서 입력을 못받는덴다 아니 그러면 공백을 포함해서 받을 수 있는 거를 알려주던가 왜 이렇게 기능이 안좋은걸 먼저 알려주는 걸까요
그리고 진은아 c언어는 입력을 받을 때 버퍼를 사용하는데 이 버퍼에 문자가 엔터기 키같은 문자가함이 되거든 그러니가 scanf로 입력을 받을 때는 반드시 getchar() 아니면 화이트 스페이스인 scanf(” “%c”) 이렇게 사용해서 입력을 받을 때 오루가 발생하지 않도록 만들자고 진은아
char str[ ] = “1234”
c언어에서 위와 같이 선언하면 컴파일러가 자동으로 문자열의 길이 +1 만큼의 문자열을 생성해서 대괄호 안에 문자열이 길이 +1 만큼의 연산을 실행한다. 뒤에 문자열의 길이보다 하나 그게 설정되는 이유는 문자 배열 마지막에 ‘\0’ 이 삽입되기 때문이다.널 문자가 자동으로 삽입되는데 그 이유는 문자열과 구분하기 위해서 이다.
뒤에 널 문자를 삽입하지 않으면 문자 배열이 생성되고 널 문자가 삽입되면 문자열이 생성된다.
또한 널 문자의 정수형 아스키 코드 값은 0 으로 문자형으로 출력해도 아무런 값이 출력되지 않지만
정수형으로 출력하면 정수 0 이 출력되는데 이는 공백문자의 아스키 코드인 32 랑은 확연히 다른 문자임을 알 수 있다.
int main() {
char str[] = "good morning!";
printf(" %d\n", sizeof(str));
printf(" %c : 널 문자 문자형 출력\n", str[13]);
printf(" %d : 널 문자 정수형 출력\n", str[13]);
str[12] = '?';// 문자형 배열에 생성된 데이터는 변경가능.
printf("문자열 출력 %s\n",str);
}
위의 코드에서 주목해야할 점은 널문자를 문자형으로 출력하면 아무거솓 출력되지 않는다는 점이다
또한 정수형으로 출력하면 0 이 출력되고 문자열 배열은 수정이 가능하다는것 그리고 형식지정자로 %s를 사용한다.
printf("문자열을 입력하세요\n");
scanf("%s", str); // & 문자를 생략했다.
문자열을 입력받는 문장에서 scanf 함수 앞에서 ‘&’문자를 사용하지 않는 것을 볼 수 있는데 이것은 문자열을 배열의 전체에 저장하므로 사용하지 않는 것으로 추측한다. 일단은 문자열을 저장하는 문자배열을 사용할 때는 & 을 사용하지 않는 것으로 기억하자.
while (str[index] != '\0') {
printf("%c", str[index]);
index++;
}
위의 코드느 scanf함수에서 입력받은 문자열을 출력하는 반복문인데 여거 주의 해야할 점은 scanf로 입력받은 문자열에서도 문자배열의 끝에 널문자가 저장되어 있다는 점이고 따라서 str[index] != '\0'
을 ㅏ사용해서 널 문자가 나타나기 전까지 출력할 수 있돌고 사용한다.
C언어에서 사용하는 모든 문자열에는 자동으로 끝에 널문자가 삽입된다. 널문자를 사용하는 이유는 문자열의 끝을 구분하기 위해서다.
int main() {
char str[50]="i like c programing!"; // 문자배열을 문자열로 초기화할 때는 배열을 초기화하는 {}을 사용할 필요가 없다.
printf("%s 저장된 문자열\n",str);
str[13] = '\0';// 13index 자리에 \0 문자 삽입
printf("%s 저장된 문자열\n",str);
str[4] = 0;
printf("%s 저장된 문자열\n",str);
}
// 여기서도 중요한게 '\0'을 삽입하는거랑 0을 삽입하는 거랑 동일한 효과를 가진다.
위의 코드에서 문자열을 출력할때 str[10] = 0; 을 실행할 때마다 출력되는 문자열의 길이가 줄어드는 것을 알 수 있는데 이는 형식지정자로 %s을 사용하면 문자열의 끝을 ‘\0으로 인시기하기 때문이다. 따라서 위의 코드에서 0이 널문자의 아스키 코드이기 때문에 출력하는 문자열의 길이가 점점 짧아지는 것을 알 수 있다.
char str[100];
printf("문자열을 입렬하세요");
scanf("%s", str);// &문자생략
int index = 0;
while (str[index] != '\0') {
printf("%c", str[index]);
index++;
}
printf("\n");
printf("\n입력받은 문자열의 길이는 %d ", index);
입력받은 문자열의 크기를 출력하는 함수에서 while (str[index] != '\0')
반복문을 널문자가 아닐때까지 수행하고 그리고 index값을 그대로 반환하는데 그 이유는 마지막에 index가 \0 까지 가기 때문에 문자열의 보이는 인덱스보다 하나더 가서 그대로 키기가 반환되니까 따로 count 변수를 사용할 필요가 없다.
일반적으로 문자열의 길이라고 해석하면 널 문자전까지의 문자열을 문자열의 길이라고 가정한다.
char *str= "qkrwlsmds"
char str[] = "qkrwlsdms"
음 일반적으로 위처럼 선언 함면 내용의 변경이 불가능하니가 상수형의 문자열 선언 이라고 한다
밑의 경우에는 변수형의 문자열 선언이라고 하는데 그 이유는 배열의 이름을 통해서 문자열의 수정이 가능하기 때뭉니다
char str[] = "hello my name is parkjineun";
위와 같이 선언한 문자열을 변수 상태의 문자열이라고 한다. 이는 배열로 선언되고 str에 첫 문자의 값이 저장된다는 점이 포인터 형태의 문자열 선언과 동일하지만 이는 배열로써 문자열을 수정가능하다는 점이 포인터 문자열선언과의 차이점이다.
char* str2 = "hello my name is yoonseloa";
str2 = "다른 문자열로 포인터를 변경"
위는 포인터 형태의 문자열의 선언이다. 이는 str2에 문자열의 첫번째 문자열이 저장된다는 점에서 변수형 문자열과 동일하지만 차이점은 바로 수정이 불가능하다는 점이다 위처럼 퍼인터 형태로 문자열을 생성하면 배열에 저장된것이아니니 메모리에 할당된 문자열의 첫단어의 주소값많이 할당되어서 수정이 불가능하다.
하지만 위와 같이 선언된 문자 포인터를 이용해서 다른 문자열을 가르키도록 수정이 가능하다.
char str[ ] = "hello my name is parkjineun";
char* str2 = "hello my name is yoonseloa";
str[0] = 'x';
str2[0] = 'X';
printf("%s , %s", str, str2);
아래와 같이 포인터로 선언한 문자열의 수정을 시도하면
Process finished with exit code 138 (interrupted by signal 10: SIGBUS)
ㅇ오류 뜨면서 안된다 주의하자 진은아
c언어에서 함수로 문자열을 전달하기 위해서는
void deliverString(char* s){
}
이렇게 선언한 뒤에 바로 문자열의 포인터 값을 전달받아야한다
호출할때
deliverString(”hello”) 이렇게 호출하면 이것은 문자열의 주소값을 전달해서 호출하는것과 같다.
“큰 따움표로 묶어서 선언한 문자열은 그 형태에 상관없이 메모리공간에 저장된 후 그 주소 값을 반환한다.”
int num = 1, num2 = 2, num3 = 3;
int *array[5] = {&num, &num2, &num3};
for (int i = 0; i < 3; i++) {
printf("%d ", *array[i]);
}
포인터 배열을 생성해서 포인터 들을 배열에 저장함
{&num, &num2, &num3}
초기화 할때 정수 변수의 주소값으로 초기화를 진행함
printf("%d ", *array[i]);
출력할때는 * 연산을 적용해서 출력한다.
char *str[] = {"안녕하세요", "박진은", " 입니다"};
for (int i = 0; i < 3; i++) {
printf("%s \n", str[i]);
}
c언어로 문자 포인터 배열을 만들어서 문자열을 초기화 할때는 큰따움표로 구성된 문자열을 사용하면된다.
그 이유는
“큰 따움표로 묶어서 선언한 문자열은 그 형태에 상관없이 메모리공간에 저장된 후 그 주소 값을 반환한다.”
위와 같다 또한 출력할때도 포인터에서 참조하는 값을 반환하는 연산자를 사용하지 않아된다.
printf("%s \n", str[i]);
이거 중요하다 진은아 이거 안지키면 컴파일도 안되더라 주의하자 진은아.
char *str[] = {"안녕하세요", "박진은", " 입니다"};
사람들이 사용할때는 위와 같이 보이지만 사실 내부적으로는
{0x10001,0x111212,0x123123} 등과 같이 주소값이 저장되어있다 진은아.
포인터를 함수에 전달하는 방식에는 두가지가 존재하는데
int reverse(char string[]){
int i =0;
while(string[i] != '\0'){
i++;
}
int end = i-1;
for(int e = 0; e< i/2; e++){
char tmp = string[e];
string[e] = string[end - e];
string[end-e] = tmp;
}
}
문자열을 뒤집에서 저장하는 방법 아니 근데 이게 오류가 너무 많이 생기는데 진짜 아무것도 안해도 오류가 생겼다가 없어졌다가 하는 거 같아서 가끔은 화가 난다.
#include<stdio.h>
int main(){
char string[100];
scanf("%s",string);
int i = 0;
while(string[i] != '\0'){
i++;
}
for(int e = 0; e<i/2; e++){
char tmp = string[e];
string[e] = string[i-e-1];
string[i-e-1] = tmp;
}
printf("%s",string);
}
밑에 있는거는오루 안나는데 위에 잇는 것은 시도 때동없이 오류가 발생하는 말썽쟁이 아이ㅏ 입니다