source

C에서 문자열을 반복하는 방법은 무엇입니까?

factcode 2022. 8. 25. 23:48
반응형

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])캐릭터를 보여주니까.

  1. sizeof()에는 끝의 늘 문자가 포함됩니다.strlen()을 사용해야 합니다(단, 콜을 루프 외부에 배치하여 변수에 저장). 그러나 이것이 예외의 원인이 아닐 수 있습니다.
  2. 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

반응형