Как перебирать строку в 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.
(свободно переведенный с немецкого языка)
Итак, что случилось с моим кодом?
Ответы
Ответ 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]); }