C에 문자열 배열을 작성하려면 어떻게 해야 하나요?
C에 문자열 배열을 작성하려고 합니다.이 코드를 사용하는 경우:
char (*a[2])[14];
a[0]="blah";
a[1]="hmm";
gcc는 "warning: assign from compatible pointer type"을 표시합니다.올바른 방법은 무엇입니까?
.printf(a[1]);
'흠', '흠', '흠', '흠', '흠', '흠', '흠', '흠', '흠', '흠', '흠', '흠', '흠', '흠', '흠', '음
끈을 바꾸고 싶지 않다면, 간단히 할 수 있습니다.
const char *a[2];
a[0] = "blah";
a[1] = "hmm";
두 을 두 포인트로 .const char
"blah"
★★★★★★★★★★★★★★★★★」"hmm"
.
실제 문자열 내용을 변경하려면 다음과 같은 작업을 수행해야 합니다.
char a[2][14];
strcpy(a[0], "blah");
strcpy(a[1], "hmm");
14개의 14개의 14개의 2개의 됩니다.char
그 후에 정적 문자열의 내용이 복사됩니다.
C에 문자열 배열을 작성하는 방법은 여러 가지가 있습니다.모든 문자열의 길이가 같거나 최대 길이가 같으면 2d 문자 배열을 선언하고 필요에 따라 할당합니다.
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
이니셜라이저 목록을 추가할 수도 있습니다.
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
이 경우 이니셜라이저의 크기 및 문자열 수가 어레이 치수와 일치한다고 가정합니다.이 경우 각 문자열 리터럴(문자 자체가 제로 종단 배열)의 내용이 strs에 할당된 메모리에 복사됩니다.이 접근방식의 문제는 내부 플래그멘테이션의 가능성입니다.5 문자 이하의 문자열이 99개, 길이가 20 문자인 문자열이1개 있는 경우, 99개의 문자열은 적어도 15개의 미사용 문자를 가집니다.그것은 공간 낭비입니다.
char의 2d 배열을 사용하는 대신 char에 대한 포인터의 1d 배열을 저장할 수 있습니다.
char *strs[NUMBER_OF_STRINGS];
의 메모리는 에 할당해야 배열 ).문자열 자체에 대한 메모리는 다른 곳에 할당해야 합니다(스태틱 어레이 또는 를 사용하여).malloc()
★★★★★★★★★★★★★★★★★」calloc()
) 예시와 할 수
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
문자열 상수의 내용을 복사하는 대신 해당 문자열 상수에 대한 포인터를 저장하는 것입니다.문자열 상수는 쓰기 불가능할 수 있습니다. 다음과 같이 포인터를 재할당할 수 있습니다.
strs[i] = "bar";
strs[i] = "foo";
그러나 문자열의 내용을 변경하지 못할 수 있습니다.
strs[i] = "bar";
strcpy(strs[i], "foo");
허용되지 않을 수 있습니다.
하시면 됩니다.malloc()
버퍼에 합니다.
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
그건 그렇고.
char (*a[2])[14];
를 char의 14 요소 배열에 대한 포인터의 2- 요소 배열로 선언합니다.
Ack! 상수 문자열:
const char *strings[] = {"one","two","three"};
내 기억이 맞다면.
아, 그리고 할당에 = 연산자가 아닌 strcpy를 사용하고자 하는군요.strcpy_s가 더 안전하지만 C89에도 C99 규격에도 없습니다.
char arr[MAX_NUMBER_STRINGS][MAX_STRING_SIZE];
strcpy(arr[0], "blah");
업데이트: Thomas가 말합니다.strlcpy
가는 길이에요.
다음은 몇 가지 옵션입니다.
char a1[][14] = { "blah", "hmm" };
char* a2[] = { "blah", "hmm" };
char (*a3[])[] = { &"blah", &"hmm" }; // only since you brought up the syntax -
printf(a1[0]); // prints blah
printf(a2[0]); // prints blah
printf(*a3[0]); // prints blah
의 a2
에 스트링 을 할 수 .
a2[0] = "hmm";
a2[1] = "blah";
★★★★★★★★★★★★★★★★a3
을 사용하다
a3[0] = &"hmm";
a3[1] = &"blah";
★★★의 a1
해서 이렇게 써야 돼요.strcpy()
것은)strncpy()
문자열 리터럴을 할당할 때도 마찬가지입니다. 는 ★★★★★★★★★★★★★★★★★★★.a2
, , , , 입니다.a3
로, 그 가 임의의 할 수 단, 포인터)는, 「어느 스토리지에도 대응합니다.a1
는 '문자 배열'의 배열이기 때문에 각 요소는 자체 스토리지를 "확장"하는 배열입니다(즉, 범위를 벗어나면 파기됨). 스토리지에만 복사할 수 있습니다.
또한 우리가 했을 때 할 수 있습니다.a2
★★★★★★★★★★★★★★★★★」a3
- literals가 되어 있는 곳를 있기 behavior), - 의 을 할당하고 string literals가 되어 있는 경우)a2
★★★★★★★★★★★★★★★★★」a3
하고, 그 에 그 를 이 그 이해야 합니다.- 이 경우 메모리의 할당을
Bah - 벌써 C++가 그리워;)
p.s. 예시가 필요하면 알려주세요.
배열에서 문자열 수를 추적하지 않고 반복하려면 마지막에 NULL 문자열을 추가하십시오.
char *strings[]={ "one", "two", "three", NULL };
int i=0;
while(strings[i]) {
printf("%s\n", strings[i]);
//do something
i++;
};
문자열이 정적인 경우 다음을 사용하는 것이 좋습니다.
const char *my_array[] = {"eenie","meenie","miney"};
기본적인 ANSI C에는 포함되어 있지 않지만 사용자 환경에서 구문이 지원되고 있을 가능성이 있습니다.이러한 문자열은 불변(읽기 전용)하기 때문에 많은 환경에서 문자열 어레이를 동적으로 구축하는 것보다 오버헤드를 적게 사용합니다.
예를 들어 소규모 마이크로컨트롤러 프로젝트에서는 이 구문은 (보통) 더 소중한 RAM 메모리 대신 프로그램메모리를 사용합니다.AVR-C 는 이 구문을 서포트하는 환경의 예입니다만, 그 외의 대부분의 환경도 서포트하고 있습니다.
또는 문자 arry(1 문자열)를 포함하는 구조 유형을 선언할 수 있습니다. 그러면 구조 배열이 생성되므로 다중 요소 배열이 생성됩니다.
typedef struct name
{
char name[100]; // 100 character array
}name;
main()
{
name yourString[10]; // 10 strings
printf("Enter something\n:);
scanf("%s",yourString[0].name);
scanf("%s",yourString[1].name);
// maybe put a for loop and a few print ststements to simplify code
// this is just for example
}
다른 어떤 방법보다 이 방법의 장점 중 하나는 이 방법을 사용하면 를 사용하지 않고도 스트링에 직접 스캔할 수 있다는 것입니다.strcpy
;
현악 리터럴은const char *
s.
그리고 괄호 사용이 이상합니다.아마 그 말은
const char *a[2] = {"blah", "hmm"};
이 명령어는 상수 문자에 대한 두 포인터의 배열을 선언하고 두 개의 하드 코드 문자열 상수를 가리키도록 초기화합니다.
안녕하세요, 아래를 시험해 보세요.
char arr[nb_of_string][max_string_length];
strcpy(arr[0], "word");
사용의 좋은 예로서 c의 문자열 배열(원하는 경우)을 들 수 있습니다.
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
int i, j, k;
// to set you array
//const arr[nb_of_string][max_string_length]
char array[3][100];
char temp[100];
char word[100];
for (i = 0; i < 3; i++){
printf("type word %d : ",i+1);
scanf("%s", word);
strcpy(array[i], word);
}
for (k=0; k<3-1; k++){
for (i=0; i<3-1; i++)
{
for (j=0; j<strlen(array[i]); j++)
{
// if a letter ascii code is bigger we swap values
if (array[i][j] > array[i+1][j])
{
strcpy(temp, array[i+1]);
strcpy(array[i+1], array[i]);
strcpy(array[i], temp);
j = 999;
}
// if a letter ascii code is smaller we stop
if (array[i][j] < array[i+1][j])
{
j = 999;
}
}
}
}
for (i=0; i<3; i++)
{
printf("%s\n",array[i]);
}
return 0;
}
ANSI C의 경우:
char* strings[3];
strings[0] = "foo";
strings[1] = "bar";
strings[2] = "baz";
코드가 함수 포인터의 배열을 만들고 있습니다.해라
char* a[size];
또는
char a[size1][size2];
대신.
좋은 방법은 스스로 끈을 정의하는 것입니다.
#include <stdio.h>
typedef char string[]
int main() {
string test = "string";
return 0;
}
그건 정말 간단해.
char name[10][10]
int i,j,n;//here "n" is number of enteries
printf("\nEnter size of array = ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
{
printf("\nEnter name = ");
scanf("%s",&name[i]);
}
}
//printing the data
for(i=0;i<n;i++)
{
for(j=0;j<1;j++)
{
printf("%d\t|\t%s\t|\t%s",rollno[i][j],name[i],sex[i]);
}
printf("\n");
}
이거 먹어봐!!!
런타임 선택에 따라 문자열의 양이 달라질 수 있는 좀 더 역동적인 문자열 배열은 놓쳤지만, 그렇지 않으면 문자열을 수정해야 합니다.
코드 스니펫을 이렇게 코딩하게 되었습니다.
#define INIT_STRING_ARRAY(...) \
{ \
char* args[] = __VA_ARGS__; \
ev = args; \
count = _countof(args); \
}
void InitEnumIfAny(String& key, CMFCPropertyGridProperty* item)
{
USES_CONVERSION;
char** ev = nullptr;
int count = 0;
if( key.Compare("horizontal_alignment") )
INIT_STRING_ARRAY( { "top", "bottom" } )
if (key.Compare("boolean"))
INIT_STRING_ARRAY( { "yes", "no" } )
if( ev == nullptr )
return;
for( int i = 0; i < count; i++)
item->AddOption(A2T(ev[i]));
item->AllowEdit(FALSE);
}
char** ev
배열 문자열에 대한 포인터를 선택하고 카운트는 다음을 사용하여 문자열의 양을 선택합니다._countof
기능.(와 유사합니다.sizeof(arr) / sizeof(arr[0])
를 참조해 주세요.
유니코드 ANSI를 사용한 유니코드 도 추가되어 .A2T
매크로를 사용할 수 있지만, 고객님이 선택하실 수 있습니다.
각 요소는 첫 번째 문자에 대한 포인터입니다.
const char *a[2] = {"blah", "hmm"};
언급URL : https://stackoverflow.com/questions/1088622/how-do-i-create-an-array-of-strings-in-c
'programing' 카테고리의 다른 글
==와 Integer.valueOf(String)의 비교 결과가 127과 128에 대해 다른 이유는 무엇입니까? (0) | 2022.08.01 |
---|---|
GCC의 C/C++ 소스에서 어셈블러 출력을 얻는 방법은 무엇입니까? (0) | 2022.08.01 |
컴포넌트에서 메인인스턴스 usint $emit 또는 vuex로 이벤트를 내보내는 방법 (0) | 2022.07.31 |
[BootstrapVue warn]: 팝오버 - 문서에서 대상 요소를 찾을 수 없습니다. (0) | 2022.07.31 |
최적의 자동 완성/제안 알고리즘, 데이터베이스 [C++/C] (0) | 2022.07.31 |