minmimzemi
@minmimzemi

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

sscanfについて

sscanfを実行して構造体のメンバに文字列を入力しようとしているんですが、コアダンプしてしまいます。どうしたら解決できるか教えて欲しいです。C言語です。

C言語

text.hファイル内

typedef struct node {
char *str;
int len;
} NODE;

typedef struct {
.
.
NODE *node
} TEXT;

extern TEXT text;


txt.cファイル内

#include
#include "text.h"

TEXT text

void printStr(void)
{

char buff[256];

.
.
.
fgets(buff, sizeof(buff), stdin);

sscanf(buff, "%s", text.node->str);
.
.

}

1

2Answer

TEXT textを宣言していますが,そのメンバであるNODE *nodeはポインタであるためまだ実体を持っていません.node->cについても同様です.
すなわち,実データが入るべき領域がまだ確保されていないので,Segmentation Faultが起こるはずです.

適宜,下記のようにしてメモリを確保する必要があります.

text.node = (NODE*)malloc(sizeof(NODE));
// 注)↑の段階では,node->cの実体はまだないことに注意

また,sscanfの使用は,バッファオーバーランの危険性により現在推奨されていません.MSVCではsscanf_sを代用するよう警告を発します.

文字列をそのまま格納したいだけなら,確保したアドレスを構造体に代入すれば十分です.

text.node->c = buff;
1Like

どうしたら解決できるか
先ずはコードを見やすく掲載しましょう!
```c:ファイル名
     コード
```
次回はmarkdown書式で記入してください。・・空白も含め全て半角で!

text.h
typedef struct node {
    char *str;
txt.c
sscanf(buff, "%s", text.node->str);

エラーメッセージや、デバックの経験からくる直感で切り分け対象と方法を決定します。

切り分け
const char *buff2 = "abc123xyz";
sscanf(buff2, "%s", text.node->str);

char str2[256]; 
sscanf(buff, "%s", str2);

どちらかでエラーが発生します。
"%s"は間違いないと思うので度外視します。

0Like

Your answer might help someone💌