1

これが文字列を逆にする私のプログラムです。James Bond標準入力で文字列を入力しているので、最後に関数strrchrを使用しようとしています。したがって、strrchr関数がB上記の文字列の値文字へのポインタを提供するかどうかを確認したいと思います。

#include<stdio.h>
#include<string.h>
int main ()
{
    char rt[100];
    char temp,*op;

    printf("enter a string\n");
    scanf("%s",rt);

    printf("the string you entered is %s\n",rt);

    int i, k, length;
    i=0;
    k=strlen(rt);

    printf("strlen gives =%d\n",k);

    length=k;
    length--;

    for(;i<k/2;i++)
    {
        temp=rt[i];
        rt[i]=rt[length-i];
        rt[length-i]=temp;
    }

    printf("the reverse string is %s\n",rt);

    op=strrchr(rt,'B');
    printf("strrchr gives %c\n",*op);
}

今、私が上を走ると、

./a.out 
enter a string
James Bond
the string you entered is James
strlen gives =5
the reverse string is semaJ
Segmentation fault

これの理由は何である可能性があります。上記のstrrchrの使用は間違っていますか?

4

3 に答える 3

4

単項演算子で逆参照opする前に、次のことを確認する必要があります(これは、文字が見つからない場合に当てはまります)。*NULL

op = strrchr(rt, 'B');

if (op != NULL)
  printf("strrchr gives %c\n", *op);
于 2011-06-22T06:39:31.363 に答える
2

これを試して:

#include<stdio.h>
#include<string.h>
int main ()
{
    char rt[100];
    char temp,*op;
    printf("enter a string\n");
    fgets(rt, 100, stdin);
    printf("the string you entered is %s\n",rt);
    int i,k,length;
    i=0;k=strlen(rt);
    printf("strlen gives =%d\n",k);
    length=k;
    length--;
    for(;i<k/2;i++)
    {
        temp=rt[i];
        rt[i]=rt[length-i];
        rt[length-i]=temp;
    }
    printf("the reverse string is %s\n",rt);
    op=strrchr(rt,'B');
    printf("strrchr gives %c\n",*op);
    return 0;
}

scanf %s非空白文字のみを取ります。だからJames Bond完全に読まれていません。fgetsうまく機能し、ユーザー入力に優先する必要があります。

scanf、gets、fgets の詳細については、こちらを参照してください。

于 2011-06-22T06:42:23.687 に答える
1

細かいマニュアルから:

正常に完了すると、strrchr() はバイトへのポインターを返すか、文字列に c が出現しない場合は null ポインターを返します。

を呼び出すときに'B'inがないため、NULL ポインターが返され、呼び出しでそれを逆参照しようとします。したがって、セグメンテーション違反です。rtstrrchr(rt, 'B')printf

于 2011-06-22T06:42:01.770 に答える