0

プログラム受信信号 SIGSEGV、セグメンテーション違反

LINE : if (argv[1][0] == '-')。

UNIXシェルで「-c」フラグが表示されたときに何かをさせようとしていました

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

    int target_column=1;
    int column_flag=0;
    int descending_flag=0;

    /* command-line argument control */
        printf("Argument(s) detected(%d)\n", argc);

        /* default mode */
        if (argc = 3)
        {
    if (argv[1][0] == '-')
             {
                 /* column flag */
                 if (argv[1][1] == 'c')
                 {
                     column_flag=1;
                     printf("column flag found, ");
                 }
                 /* error checking */
                 else
                 {
                     fprintf(stderr, "tsort -c <column> [-d]\n");
                     exit(EXIT_FAILURE);
                 }
             }

あなたの答えに感謝します。それは間違いなくその小さなタイプミスでした。

4

3 に答える 3

4

引数の数を確認したい場合は、次を使用します==

if (argc = 3)   // This assigns 3 to argc and always yields true
{
    if (argv[1][0] == '-')

する必要があります

if (argc == 3)
{
    if (argv[1][0] == '-')

コンパイラはこれについて警告する必要があります。-Wall -Wextraそうでない場合は、これを回避するために常に でコンパイルしてください。

于 2013-09-21T16:01:13.097 に答える
3

コードにタイプミスがあります:

if (argc = 3)

むしろ次のようにする必要があります。

if (argc == 3)

.

このようなタイプのエラーを避けるために、定数を左側に置くことがよくあります。次に例を示します。

if(3 = argc)

定数を代入できないため、コンパイルできません。

于 2013-09-21T16:01:17.950 に答える
1

次の行で argc の値を 3 に変更します。

if (argc = 3)

そのはず:

if (argc == 3)

C++ では割り当てに戻り値があるため、これは機能します (コンパイラはエラー メッセージを表示しません)。この場合、その値は 3 で、true と評価されます。したがって、存在しない可能性がある「-」を探して、常に最初の引数にアクセスしようとします。これにより、セグメンテーション違反が発生します。

于 2013-09-21T16:01:11.410 に答える