`Ошибка сегментации возникает в 16-й строке цикла while на второй итерации. Кажется, что-то, о чем я не знаю, происходит после 19-й строки. Рассматриваемый файл начинается с 255,255,255,255,255... и через долгое время он переключается между значениями 255 и 0. и вместо того, чтобы печатать их, мне нужно поместить их внутри функции, но я могу сделать это сам
(Я не знаком ни с какой терминологией и понятия не имею, как это исправить, потому что я новичок в c)`
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char a[40];
char destination[40];
char c;
char * ptr;
FILE *file;
if ((file = fopen("file_rgb.txt", "r")) == NULL){
printf("unable to open file");
return 1;
}
while ((c = getc(file)) != EOF){
if (&c == ",")
continue;
char * source = &c;
strcpy(destination, source);
ptr = strcat(a ,destination);
printf("%s", a); //after this I need to empty the string for the next rgb value which has not been yet accomplished.
}
if (fclose(tetkabetka) == EOF){
printf("unable to close file");
return 1;
}
return 0;
}
Компилятор показывает этот странный код выхода, но ничего не выводит. Компилятор выдает эти ошибки, когда я удаляю символ «&» перед переменной «c».
test.c: In function 'main':
test.c:17:15: warning: comparison between pointer and integer
17 | if (c == ",")
| ^~
test.c:19:25: warning: initialization of 'char *' from 'char' makes pointer from integer without a cast [-Wint-conversion]
19 | char * source = c;
| ^
[Done] exited with code=3221225477 in 0.254 seconds
Я не понимаю, почему c превращается в указатель (с моим ограниченным опытом, поскольку я нуб) объяснение было бы чрезвычайно признательно.
if (&c == ",") никогда не будет правдой. if (c == ',') может быть то, что вы хотите. c должен быть int, чтобы правильно обнаружить EOF, а char * source = &c; — это нонсенс, поскольку это не дает вам требуемой строки с нулевым завершением, которая требуется strcpy.
@Kavicky420, код выхода 3 221 225 477 такой же, как 0xC000 0005. Попробуйте выполнить поиск по этой шестнадцатеричной константе.
char * source = &c; strcpy(destination, source) неверно, если только c == 0 (и я имею в виду 0, а не '0'). Ни в каком другом случае source не указывает на завершающийся нулем массив char, как того требует strcpy.
Чтобы немного расширить комментарий @RetiredNinja, в C "," — это строковый литерал, тогда как ',' — это (целочисленная) символьная константа. Между ними существуют связи, но они ни в коей мере не взаимозаменяемы. Последнее имеет смысл сравнивать со значением char.
относительно странного кода выхода. Если вы потратите время и прочтете буквально то, на что он указывает, вполне возможно, что вы могли бы выявить и устранить хотя бы некоторые из этих проблем самостоятельно. Коды выхода и сообщения об ошибках полезны. Просто найдите время, чтобы прочитать, что они говорят.
Подсказка: warning: initialization of 'char *' from 'char' makes pointer from integer without a cast почти всегда является ошибкой.
И вы можете сделать это, указав компилятору рассматривать предупреждения как ошибки.





Похоже, у вас есть некоторые фундаментальные недопонимания о строках в C. Строки в C представляют собой массивы символов, оканчивающиеся нулевым байтом ('\0'). Если такой массив символов не заканчивается нулевым байтом, обработка его как строки приводит к неопределенному поведению.
Поскольку ваша переменная c представляет собой всего лишь один символ, а не массив символов, единственный способ рассматривать ее как строку — это сделать ее самой 0.
if (&c == ",") continue;
Должно быть сравнение самой переменной с ','.
if (c == ',')
continue;
И вы не должны рассматривать указатель на c как строку, которую можно передать strcpy.
Дальнейшие проблемы:
strcat с a, но a не инициализирован. char a[40] = {0};a может содержать только 40 символов, но вы никогда не проверяете, не переполнен ли этот буфер.char, но getc возвращает int. Это может вызвать проблемы при сравнении этого значения с EOF.Кроме того, == не подходит для сравнения строк. Смотри strcmp
Что такое
tetkabetka? В любом случае этоif (&c == ",")очень странно. Кроме того, используйтеint cс файловыми функциями, такими какgetc(). Это тот тип, который они используют.