0

基本的に文字列として扱われる char* を作成しています。文字列は何度も使用されると想定されています。whileループでチェックしようとするたびに、「終了」するのが正しいかどうかを確認しようとしています...

*セグメンテーション エラーが発生し続けます...何が間違っているのでしょうか?かなりばかげた間違いです。

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

int main(int argc, char* argv[])
{

    char* input = (char*)malloc(sizeof(char));
    input = "CONTINUE";

    while(strcmp(input, "quit") != 0)
    {
            printf("%s", "System: ");
            scanf("%s", input);
    }
    return 0;
}
4

2 に答える 2

1

私が最初に見た2つの問題:

char* input = (char*)malloc(sizeof(char)); 
  1. ポインタに 1 文字だけのメモリを割り当てています。1文字だけでなく、文字列を保持するのに十分なメモリが必要です。

  2. を使用して、割り当てられたバッファに文字列をコピーする必要がありますstrcpy。ポインターに文字列リテラルを割り当てないでください。このような文字列リテラルを変更すると、Undefined Behaviorになることに注意してください。

    input = "CONTINUE";

上記の2を行う正しい方法は次のとおりです。

char* input = (char*)malloc(sizeof(MAX_LENGTH)); 
strcpy(input, "YOURSTRING"); 

MAX_LENGTH入力文字列を保持するのに十分な場所。

于 2011-12-09T03:55:41.000 に答える
1

不正なリテラルを変更しようとしています。試す:

char* input = (char*)malloc(sizeof(char)); /* You need more than one char. */
char* input = (char*)malloc(LENGTH); /* Allocate `LENGTH` chars. */

input = "CONTINUE"; /* You can't write (scanf) over a string literal. */
strcpy(input, "CONTINUE"); /* Now it's legal to write over `input`. */

その他の注意点:

  • scanfそのままの "%s"を使用するのは安全ではありません。"%10s"悪意のある可能性のあるユーザーが 10 文字を超えて入力しないようにするために、次のようなものを使用する必要があります。

  • 1 であることが保証されているsizeof(char)ため、必要ないことをご存知ですか?

于 2011-12-09T03:56:03.323 に答える