0

ユーザー入力文字列の保存方法がわかりません。

ユーザーに 2 つの個別の文字列変数 (単語) を要求し、後で変数として使用できるように保存しreferenceますqueryscanfを使用してユーザー入力を取得し%s、変数を保存することを考えました。

コードの変更方法に応じて、セグメンテーション違反または間違った出力が発生します。私は何を間違っていますか?

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(void)
{

  char *reference, *query;

  printf("\n Enter reference genome file name:  ");
  scanf("%s", reference);

  printf("\n Enter sequence query file name:  ");
  scanf("%s", query);

  printf("\n\n Reference file used was: %s\n", reference);
  printf("Query sequence file used was: %s\n", query);

  return 0;
}
4

2 に答える 2

2

の代わりに(文字の配列) をchar*割り当てる必要があります。char[]

次のように文字列を宣言します。

char reference[80];
char query[80];

このようにして、コンピューターは文字列用にどれだけのスペースを節約すべきかを認識します。これが、文字列の先頭を指すポインターを持っていたが、それを格納するためのメモリがなかったため、以前はセグメンテーション違反が発生していた理由です。

コードを次のように変更しました。

#include <stdio.h>

int main() {
    char reference[80];
    char query[80];

    printf("\nEnter reference genome file name:  ");
    scanf("%s", reference);

    printf("\nEnter sequence query file name:  ");
    scanf("%s", query);

    printf("\nReference file used was: %s\n"
           "Query sequence file used was: %s\n", reference, query);

    return 0;
}

私はコンパイルしgccてサンプルを実行しました:

Enter reference genome file name:  file1.txt

Enter sequence query file name:  file2.txt

Reference file used was: file1.txt
Query sequence file used was: file2.txt
于 2013-09-28T04:22:39.270 に答える
2

ここ:

char *reference, *query;

文字列用のストレージが割り当てられていません。あなたはこのようにすることができます:

char reference[100], query[100];

これは、事前に最大入力サイズを知っていることを前提としており、scanf に最大サイズを伝えるなどして、バッファーがオーバーフローしないように追加の手順を実行する必要があります。

scanf("%99s", reference);

戻り値をチェックして、ユーザーが入力しすぎたかどうかを確認できるため、切り捨てられたかどうかがわかります。

于 2013-09-28T04:23:12.187 に答える