배열을 한 번 수동으로 루프하여 각 문자 배열의 strlen 수를 계산하고 합계하여 대상을 합계 값으로 할당 한 다음 배열을 다시 반복해야합니까?c에서 문자 배열 배열을 반복하는 방법은 무엇입니까?
문자 배열을 포함하는 배열의 크기를 찾아서 반복 할 수있는 방법은 무엇입니까?
배열을 한 번 수동으로 루프하여 각 문자 배열의 strlen 수를 계산하고 합계하여 대상을 합계 값으로 할당 한 다음 배열을 다시 반복해야합니까?c에서 문자 배열 배열을 반복하는 방법은 무엇입니까?
문자 배열을 포함하는 배열의 크기를 찾아서 반복 할 수있는 방법은 무엇입니까?
당신은 어떻게 당신이 그들을 반복 할 수 있도록 문자의 배열을 포함하는 배열의 크기를 찾을 수 있습니까?
- 기록 당신이 변수에 할당 배열의 문자열의 수 :
두 가지 방법이 있습니다.
char*
을 할당하고 NUL 문자가 문자열을 종료하는 데 사용되는 것과 비슷한 방식으로 NIN 포인터를 센티널로 저장합니다.즉, C는 원하는 정보를 제공하지 않으므로 어레이를 할당 할 때 자신의 부기를 수행해야합니다. 두 번째 제안을 수행하면 실제 연결을 수행 할 때 '\0'
을위한 공간을 예약하는 것을 잊지 마세요
size_t sum_of_lengths(char const **a)
{
size_t i, total;
for (i = total = 0; a[i] != NULL; i++)
total += strlen(a[i]);
return total;
}
와 문자열의 배열에 문자의 총 수를 얻을 수 있습니다.
우리가 간다. 그 모든 답변을 주셔서 감사합니다. –
0을 기준으로 + 1도 반환해야합니다. –
... 또는 배열을 실제로 가지고 있다면 sizeof (array)/sizeof (entry)를 사용하여 길이를 얻으십시오 (포인터가 아닙니다 - 그들은 동일하지 않습니다). 많은 사람들 (나도 지난 10 년 정도)은 배열과 포인터가 같다고 생각하지만 그렇지 않습니다. 배열은 필요한 경우 포인터가 자동으로 축약됩니다. 예 : int a [10] = {0}; sizeof (a)/sizeof (int)는 10을 제공합니다; int * a = malloc (10 * sizeof (int)); sizeof (a) == sizeof (int *)이 경우 – griffin
문자열을 연결하려는 것 같습니다. 그렇다면 그렇습니다. 할당하기 전에 원하는 공간의 양을 알아야합니다.
사실, realloc
을 사용할 수 있지만 매번 이전 문자열이 복사 될뿐 아니라 효과가 떨어집니다.
일부 코드 :
int i,l=1;
for (i=0;i<n;i++) l+=strlen(s[i]);
char *r=malloc(l);
r[0]=0;
for (i=0;i<n;i++) strcat(r,s[i]);
편집 (char *s[]
및 int n
가정은)는 길이를 알고 몇 가지 의견으로, strcat
는 효과가있다. (. 그것은 한 번에 메모리를 할당하기 때문에 나는 아직도 그것을 선호) 좀 더 효율적인 코드는 다음과 같습니다
int i,l=1;
for (i=0;i<n;i++) l+=strlen(s[i]);
char *r=malloc(l);
char *d=r;
for (i=0;i<n;i++) {
srtcpy(d,s[i]);
d+=strlen(s[i]);
}
이'strcat'의 사용은 엄청나게 비쌉니다 : 그것은 알고리즘이 O (n²) 시간 동안 선형으로 실행될 수있게합니다. –
어떻게 선형을 수행 할 수 있습니까? @asaelr 제 질문 중 일부는이 경우 n이 무엇인지 파악하는 방법입니다. –
난 당신이 배열의 모든 스트링의 연결 한 문자열을 만들려고 노력하고 있다고 가정합니다.
이 일의 2 가지 방법이 있습니다 : 당신이 제안으로
2 개 패스를 확인, 두 번째 패스에서 문자열을, 첫 번째 패스의 길이를 합산 대상 문자열을 할당 한 다음 추가는
1 회 통과. 버퍼를 크기에 할당하여 시작하십시오. 총 크기를 추적하면서 문자열을 추가하십시오. 문자열에 충분한 공간이 없으면 버퍼를 realloc()
으로 다시 할당하십시오. 가장 효율적인 재 할당 방법은 매번 버퍼 크기를 두 배로하는 것입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *nstrdup(char **args);
int main (int argc, char **argv)
{
char * this;
this = nstrdup(argv+1);
printf("[%s]\n", this);
return 0;
}
char *nstrdup(char **args)
{
size_t len, pos;
char **pp, *result;
len = 0;
for (pp = args; *pp; pp++) {
len += strlen (*pp);
}
result = malloc (1+len);
pos = 0;
for (pp = args; *pp; pp++) {
len = strlen (*pp);
memcpy(result+pos, *pp, len);
pos += len;
}
result[pos] = 0;
return result;
}
나는 메타를 좋아하지 않는다. (나는 인터페이스를 이해하지 못한다.) 공백을 편집하는 사람들 (일종의 기업 정식 형식)은 낮은 라이프 스타일이라고 생각합니다. 가버려. ** 그냥 내 소스를 터치하지 마세요 ** 당신 whitespae 편집자. 소스를 읽을 수 없으면 java로 돌아가십시오. – wildplasser
[meta] 위조 된 공백 문자를 허용/거부하는 옵션을 추가하십시오. – wildplasser
일부 코드는 귀하가 무엇을 요구하는지 이해하는 데 도움이됩니다. – user7116
C 문자열 배열을 복사하려는 것 같습니다. 그게 맞습니까? – vitaut
결국 배열의 문자열을 단일 문자열로 연결하려고합니다. 대상 문자열에 할당 할 메모리 공간을 알아야합니다. for 루프에서 종료 조건으로 넣을 내용, 즉 배열의 길이를 알 수있는 방법을 알지 못합니다. –