Как выполнить итерации по строке в 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.

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

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

48
задан Peter Mortensen 26 May 2015 в 20:09
поделиться

11 ответов

Вы хотите:

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

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

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

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

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

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

for (i = 0; source[i] != 0; i++){
55
ответ дан 26 November 2019 в 18:40
поделиться
  • sizeof (source) возвращает вам размер char * , а не длину строки. Вы должны использовать strlen (source) , и вы должны вывести его из цикла, иначе вы будете пересчитывать размер строки в каждом цикле.
  • При печати с модификатором формата % s printf ищет char * , но на самом деле вы передаете char . Вы должны использовать модификатор % c .
1
ответ дан 26 November 2019 в 18:40
поделиться
  1. sizeof () включает завершающий нулевой символ. Вам следует использовать strlen () (но вывести вызов за пределы цикла и сохранить его в переменной), но, вероятно, не это вызывает исключение.
  2. вы должны использовать «% c», а не «% s» в printf - вы печатаете символ, а не строку.
2
ответ дан 26 November 2019 в 18:40
поделиться

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

Next:

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

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

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

0
ответ дан 26 November 2019 в 18:40
поделиться

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

Вот так:

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

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

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

}
0
ответ дан 26 November 2019 в 18:40
поделиться

Одна распространенная идиома:

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

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

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

Вместо того, чтобы использовать 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;
}
3
ответ дан 26 November 2019 в 18:40
поделиться

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

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

2
ответ дан 26 November 2019 в 18:40
поделиться

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

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

    }


 }
2
ответ дан 26 November 2019 в 18:40
поделиться

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

0
ответ дан 26 November 2019 в 18:40
поделиться

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

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

подойдет

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

0
ответ дан 26 November 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: