C에서 문자열을 반복하는 방법은 무엇입니까?
난 지금 이걸 시도하고 있어.
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s %s sourcecode input", argv[0], argv[1]);
}
else {
char source[] = "This is an example.";
int i;
for (i = 0; i < sizeof(source); i++) {
printf("%c", source[i]);
}
}
getchar();
return 0;
}
이것도 동작하지 않습니다.
char *source = "This is an example.";
int i;
for (i = 0; i < strlen(source); i++){
printf("%c", source[i]);
}
에러가 발생하다
Test.exe의 0x5bf714cf(msvcr100d.dll)에서 처리되지 않은 예외: 0xC00005:위치 0x000054에서 읽는 동안 액세스 위반이 발생했습니다.
(독일어 번역)
내 코드가 뭐가 잘못됐지?
원하는 것:
for (i = 0; i < strlen(source); i++) {
sizeof를 지정하면 문자열이 아닌 포인터의 크기가 표시됩니다.단, 포인터를 배열로 선언하면 동작합니다.
char source[] = "This is an example.";
그러나 어레이를 기능하게 하면, 그것도 포인터로 붕괴합니다.문자열은 항상 stren을 사용하는 것이 좋습니다.%c를 사용하도록 printf를 변경하는 것에 대해 다른 사람들이 말한 것에 주목하십시오.또한 효율에 관한 myers의 코멘트를 고려하여 콜을 루프를 벗어나 strlen으로 이동하는 것이 좋습니다.
int len = strlen(source);
for (i = 0; i < len; i++) {
또는 루프를 다시 작성합니다.
for (i = 0; source[i] != 0; i++) {
일반적인 관용구는 다음과 같습니다.
char* c = source;
while (*c) putchar(*c++);
몇 가지 주의:
- C에서는 문자열은 늘 종단됩니다.판독된 문자가 null 문자가 아닌 동안 반복합니다.
*c++
증가 증분c
참조되지 않은 오래된 값을 반환합니다.c
.printf("%s")
null로 끝나는 문자열이 아니라 까맣게 타다 주다.는 문자가 아닌 늘 종단 문자열을 출력합니다.당신의 접근 위반의 원인이다.이것이액세스 위반의 원인입니다.
최적화된 접근법:
for (char character = *string; character != '\0'; character = *++string)
{
putchar(character); // Do something with character.
}
대부분의 C문자열 움직이고 있다는자마자 문자가 되대부분의 C문자열은 늘종단 처리됩니다.즉,문자가null-terminated가 되는 즉시 의미 null-terminated.'\0'
그 루프 스톱해야 한다.루프가 정지합니다.그 그*++string
포인터를 하나의 바이트, 그 다음 역 참조, 그리고 루프 반복 이전하고 있습니다.A포인터를 1바이트이동한 후루프가 반복됩니다 해제하고 참조.
왜 이 더이것이보다 효율적인 이유 것보다 훨씬 효율적이다 그 이유이다.strlen()
왜냐하면strlen은 이미 실을 통해 길이를 찾으려고 너 두번씩 효과적으로strlen은 이미 스트링을 통해 길이를 찾기 위해 루프를 하고 있기 때문에 실제로 2회(필요한 횟수보다 1회 이상)를 반복할수 있습니다와(하나보다 많은 시간이 필요한)를 반복할 것 반복적이다.strlen()
.
C-String의 마지막 인덱스는 항상 정수 값 0이므로 "null terminated string"이라는 문구가 사용됩니다.정수 0은 C의 부울값 false와 같기 때문에 이를 사용하여 for 루프의 간단한 while 구를 만들 수 있습니다.마지막 인덱스에 도달하면 0이 검출되어 false와 같게 되어 for 루프가 종료됩니다.
for(int i = 0; string[i]; i++) { printf("Char at position %d is %c\n", i, string[i]); }
위와 같이 strlen을 사용하는 대신 NULL 문자를 확인할 수 있습니다.
#include <stdio.h>
int main(int argc, char *argv[])
{
const char *const pszSource = "This is an example.";
const char *pszChar = pszSource;
while (pszChar != NULL && *pszChar != '\0')
{
printf("%s", *pszChar);
++pszChar;
}
getchar();
return 0;
}
그냥 스트렌으로 크기를 바꾸세요.
다음과 같이 합니다.
char *source = "This is an example.";
int i;
for (i = 0; i < strlen(source); i++){
printf("%c", source[i]);
}
이거면 될 것 같아
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
char *source = "This is an example.";
int length = (int)strlen(source); //sizeof(source)=sizeof(char *) = 4 on a 32 bit implementation
for (int i = 0; i < length; i++)
{
printf("%c", source[i]);
}
}
sizeof(source)
포인터에바이트 수를 반환합니다 필요한 바이트 포인터를이 요구하는 수를 반환합니다.char*
. 당신은.로 대체해야 합니다로 교체해야 합니다.strlen(source)
표시하려는 문자열의 길이가 됩니다.
또, 아마 교환해 주셔야 할 것 같습니다.printf("%s",source[i])
와 함께printf("%c",source[i])
캐릭터를 보여주니까.
- sizeof()에는 끝의 늘 문자가 포함됩니다.strlen()을 사용해야 합니다(단, 콜을 루프 외부에 배치하여 변수에 저장). 그러나 이것이 예외의 원인이 아닐 수 있습니다.
- printf에 "%s"가 아닌 "%c"를 사용해야 합니다. 문자열이 아닌 문자를 인쇄하고 있습니다.
sizeof(source)
그 사이즈가 당신에게 돌아오고 있다.char*
, 문자열 길이가 아닙니다.사용하셔야 합니다.strlen(source)
루프를 벗어나야 합니다.그렇지 않으면 루프마다 문자열 크기를 재계산합니다.- 를 사용하여 인쇄함으로써
%s
형식 한정자,printf
를 찾고 있습니다.char*
하지만 실제로 당신은 통과하고 있습니다.char
. 를 사용해 주세요.%c
수식어
size of를 strlen으로 바꾸면 동작합니다.
sizeof(source)
소스가 char *로 선언되면 포인터의 크기를 반환합니다. 올바른 사용 방법은 다음과 같습니다.strlen(source)
.
다음:
printf("%s",source[i]);
문자열이 필요합니다. 즉, %s은 문자열을 예상하지만 각 문자를 인쇄하기 위해 반복하고 있습니다.따라서 %c를 사용합니다.
그러나 인덱스 i를 사용하여 문자열에 액세스(반복)하는 방법은 올바르기 때문에 다른 문제는 없습니다.
ANSI 문자열을 사용하려면 첫 번째 문자에 대한 포인터가 필요합니다.
printf("%s", source + i);
그 일을 할 수 있다
게다가, 물론, 넌 그 말들을strlen(source)
,것은 아니다.sizeof(source)
.
언급URL : https://stackoverflow.com/questions/3213827/how-to-iterate-over-a-string-in-c
'source' 카테고리의 다른 글
Vue.js 캐시 메서드 결과 (0) | 2022.08.27 |
---|---|
MacOS에서 기본 Java(JDK) 버전을 설정하거나 변경하는 방법은 무엇입니까? (0) | 2022.08.27 |
검색 메서드가 반환 값을 생성할 수 없는 경우 'null'을 반환해야 합니까? 아니면 예외를 발생시켜야 합니까? (0) | 2022.08.25 |
Vue - 이 기능을 사용하거나 액세스할 수 없습니다.mixin 파일의 $120 또는 vue 인스턴스 (0) | 2022.08.25 |
django rest 프레임워크 + vue SPA 인증 처리 (0) | 2022.08.25 |