Прямо сейчас я пробую это:
#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.
(свободно переведенный из немецкого языка)
Так что случилось с моим кодом?
Вы хотите:
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++){
sizeof (source)
возвращает вам размер char *
, а не длину строки. Вы должны использовать strlen (source)
, и вы должны вывести его из цикла, иначе вы будете пересчитывать размер строки в каждом цикле. % s
printf
ищет char *
, но на самом деле вы передаете char
. Вы должны использовать модификатор % c
. sizeof(source)
возвращает размер указателя, поскольку источник объявлен как char *.
Правильный способ использования - strlen(source)
.
Next:
printf("%s",source[i]);
ожидает строку. Т.е. %s ожидает строку, но вы выполняете итерацию в цикле для печати каждого символа. Следовательно, используйте %c.
Однако ваш способ доступа (итерации) к строке с использованием индекса i является правильным, и поэтому в нем нет других проблем.
Просто замените sizeof на strlen.
Вот так:
char *source = "This is an example.";
int i;
for (i = 0; i < strlen(source); i++){
printf("%c", source[i]);
}
Одна распространенная идиома:
char* c = source;
while (*c) putchar(*c++);
Несколько примечаний:
* c ++
увеличивает c
и возвращает разыменованное старое значение c
. printf ("% s")
печатает строку с завершающим нулем, а не символ. Это причина вашего нарушения доступа. Вместо того, чтобы использовать 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;
}
sizeof(source)
возвращает количество байт, требуемых указателем char*
. Вам следует заменить его на strlen(source)
, который будет длиной строки, которую вы пытаетесь отобразить.
Также, вероятно, следует заменить printf("%s",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]);
}
}
Вам нужен указатель на первый символ, чтобы получить ANSI-строку.
printf("%s", source + i);
подойдет
Плюс, конечно, вы должны были иметь в виду strlen(source)
, а не sizeof(source)
.