无法打印char *字符串

时间:2017-04-24 01:12:31

标签: c string printf

我不清楚我的程序有什么问题,它是一个简单的代码来打开文件,从中读取第一行,然后打印它。但程序一直在崩溃。我的文本文件的实际内容是一个句子:测试我的代码。

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>

中的库函数

3 个答案:

答案 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字符串和内存管理。