Я схожу с ума от C. Я программирую на JavaScript, Ruby, Python, PHP, Lua и даже на Java... Недавно я попытался запрограммировать простой цикл чтения-оценки-печати на языке C. И у меня очень странное поведение с этим простым, базовым кодом в Windows 10. Этот код компилируется с помощью стандартной цепочки инструментов Visual Studio.
Помоги мне, ты моя единственная надежда.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
const size_t line_length = 1024;
char * line = malloc(line_length * sizeof(char));
memset(&line, '\0', line_length);
char c;
unsigned short count = 0;
// fflush(stdin); // tried this, same thing
printf("Enter: ");
while ((c = getchar()) != '\n' && c != EOF && count < line_length - 1) {
line[count] = c;
count += 1;
}
printf("Count : %d\n", count);
printf("%s\n", line);
printf("End of program.\n");
fflush(stdout);
free(line);
return EXIT_SUCCESS;
}
Ожидаемый результат:
Enter: hello
Count : 5
hello
Фактический выход (1):
Enter: hello
Фактический выход (2):
Вам даже не нужно вызывать memset, вы можете поставить line[count] = '\0'; сразу после цикла while.





С вашим кодом есть несколько проблем:
#include <string.h> ради memsetfflush(stdin) имеет неопределенное поведение (хорошо, вы это закомментировали, но это все равно полезно знать)int, а не char. Прочтите это для получения дополнительных объяснений.memset(&line, '\0', line_length) неверно, должно быть memset(line, '\0', line_length); (без &), line уже является указателем на память, которую вы хотите установить в 0.Исправленный код, смотрите мои комментарии, начинающиеся с ///.
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /// added
int main(int argc, char* argv[])
{
const size_t line_length = 1024;
char* line = malloc(line_length);
memset(line, '\0', line_length); /// removed &
int c; /// int instead of char
unsigned short count = 0;
// fflush(stdin); /// fflush(stdin); is UB
printf(">>> ");
while ((c = getchar()) != '\n' && c != EOF && count < line_length - 1) {
line[count] = c;
count += 1;
}
printf("Count : %d\n", count);
printf("%s\n", line);
printf("End of program.\n");
fflush(stdout);
free(line);
return EXIT_SUCCESS;
}
@Xitog: важно использовать int c; вместо char c;, потому что char не гарантирует, что сможет представлять значение EOF, тогда как int может. Кроме того, даже если char может представлять значение EOF (что имеет место на большинстве платформ), вы должны использовать int вместо char, потому что в противном случае вы не сможете отличить значение EOF от значения c. реальный персонаж. Однако, как только вы определили, что EOF не имеет значения int, вы можете преобразовать значение char в int c;. Явное приведение типов не требуется.
Незначительное: line_length и count заслуживают того, чтобы быть одного типа. Рекомендую оба size_t.
@AndreasWenzel «как только вы определили, что c не имеет значения EOF, вы можете преобразовать значение int в char» --> за исключением того, что педантичное присвоение значения int, такого как UCHAR_MAX, знаковому char вызывает поведение, определяемое реализацией. Очень часто это нормально. Приведение типов подавляет некоторые предупреждения компилятора о сужении line[count] = c;, поэтому приведение типов здесь вполне подходит.
Просто используйте
calloc()вместоmalloc()+ заполните память нулями...