我不清楚我的程序有什么问题,它是一个简单的代码来打开文件,从中读取第一行,然后打印它。但程序一直在崩溃。我的文本文件的实际内容是一个句子:测试我的代码。
int main(void)
{
FILE *stream;
char *s;
stream = fopen("input.txt", "r");
fscanf(stream, " %s", &s);
printf("%s", s);
fclose(stream);
return 0;
}
我已被指示不使用<string.h>
答案 0 :(得分:3)
s
是一个未初始化的指针。您需要为fscanf
分配一些内存来写入。
答案 1 :(得分:0)
您的代码中缺少一些内容。
// Uninitialise pointer, you need to allocate memory dynamically with malloc before you use it. That is
char *s;
int size = 20; // size of the string you want
s = malloc(size * sizeof(char));
// Or you can use a VLA and with this you don't have to use free(s)
char s[20];
// fopen could fail, always check the return value before using it.
stream = fopen("input.txt", "r");
if(stream == NULL){
perror("File opening failed");
return EXIT_FAILURE;
}
fscanf(stream, "%s", s);
//Don't forget to do free(s) to free memory allocated with malloc . when you are done with it
答案 2 :(得分:0)
char *s;
分配保存内存地址所需的字节数(在大多数系统上为32/64位)。 但由于您没有初始化指针,因此其值(指向的地址)未定义。
Ergo:fscanf尝试写入未定义的内存地址。
我将其初始化为char * s = NULL;
是的,指针现已初始化(耶!)但现在指向无处。
Ergo:fscanf将尝试写入任何内容。
解决方案是分配fscanf可以使用的一些内存。 fscanf不会为你神奇地分配内存!
您可以使用堆栈内存或动态分配的内存(堆)。
堆栈内存更易于管理,但比堆小得多。
这是一个使用堆栈内存的解决方案:
// Allocates 10 bytes on the stack
// Given 1 Character = 1 Byte the
// buffer can hold up to 9 characters.
char myBuffer[10];
// Initialize s with the address of myBuffer
char *s = myBuffer;
// Call fscanf
fscanf(stream, "%9s", s);
您可能想知道为什么我使用%9s
代替%s
。
原因是防止缓冲区溢出:
fscanf不知道缓冲区有多大,所以你需要告诉它。
否则fscanf将写入超出分配内存的数据。
我建议你阅读C字符串和内存管理。