Подтвердить что ты не робот

Как перебирать строку в 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]);
}

Я получаю сообщение об ошибке

Необработанное исключение в 0x5bf714cf (msvcr100d.dll) в Test.exe: 0xC0000005: нарушение доступа при чтении в позиции 0x00000054.

(свободно переведенный с немецкого языка)

Итак, что случилось с моим кодом?

4b9b3361

Ответ 1

Вы хотите:

for (i = 0; i < strlen(source); i++){

sizeof дает размер указателя, а не строку. Однако это сработало бы, если бы вы указали указатель как массив:

char source[] = "This is an example.";

но если вы передадите массив в функцию, это тоже будет распадаться на указатель. Для строк лучше всего использовать strlen. Обратите внимание на то, что другие сказали об изменении printf, чтобы использовать% c. А также, принимая во внимание комментарии мейерса к эффективности, было бы лучше перевести вызов на strlen из цикла:

int len = strlen( source );
for (i = 0; i < len; i++){

или переписать цикл:

for (i = 0; source[i] != 0; i++){

Ответ 2

Один из распространенных идиом:

char* c = source;
while (*c) putchar(*c++);

Несколько примечаний:

  • В C строки имеют нулевое завершение. Вы выполняете итерацию, пока символ чтения не является нулевым символом.
  • *c++ увеличивает c и возвращает старое значение c.
  • printf("%s") печатает строку с завершающим нулем, а не char. Это является причиной нарушения вашего доступа.

Ответ 3

Вместо использования 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;
}

Ответ 4

sizeof(source) возвращает количество байтов, необходимых указателю char*. Вы должны заменить его на strlen(source), который будет длиной строки, которую вы пытаетесь отобразить.

Кроме того, вы должны заменить printf("%s",source[i]) на printf("%c",source[i]), поскольку вы показываете символ.

Ответ 5

Это должно работать

 #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]);

    }


 }

Ответ 6

  • sizeof() включает завершающий нулевой символ. Вы должны использовать strlen() (но вывести вызов за пределы цикла и сохранить его в переменной), но это, вероятно, не то, что вызывает исключение.
  • вы должны использовать "% c", а не "% s" в printf - вы печатаете символ, а не строку.

Ответ 7

  • sizeof(source) возвращает вам размер char*, а не длину строки. Вы должны использовать strlen(source), и вы должны переместить это из цикла, иначе вы будете пересчитывать размер строки в каждом цикле.
  • При печати с помощью модификатора формата %s printf ищет char*, но вы фактически передаете char. Вы должны использовать модификатор %c.

Ответ 8

Просто измените sizeof на strlen.

Вот так:

char *source = "This is an example.";
int i;

for (i = 0; i < strlen(source); i++){

    printf("%c", source[i]);

}

Ответ 9

Замените sizeof на strlen, и он должен работать.

Ответ 10

Вам нужен указатель на первый char, чтобы иметь строку ANSI.

printf("%s", source + i);

выполнит задание

Плюс, конечно, вы должны были означать strlen(source), а не sizeof(source).

Ответ 11

sizeof(source) возвращает sizeof указателя, поскольку источник объявлен как char *. Правильный способ его использования - strlen(source).

Далее:

printf("%s",source[i]); 

ожидает строку. i.e% s ожидает строку, но вы выполняете итерацию в цикле для печати каждого символа. Следовательно, используйте% c.

Однако ваш способ доступа (итерации) строки с использованием индекса я является правильным и, следовательно, в нем нет других проблем.

Ответ 12

Последним индексом C-String всегда является целочисленное значение 0, отсюда и фраза "строка с нулевым окончанием". Поскольку целое число 0 совпадает с логическим значением false в C, вы можете использовать его для создания простого предложения while для цикла for. Когда он достигает последнего индекса, он находит ноль и приравнивает его к ложному, заканчивая цикл for.

for(int i = 0; string[i]; i++) { printf("Char at position %d is %c\n", i, string[i]); }