0

私はC言語の新入生で、これを思いつきました。私はコードします:

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

int main(void)
{
   char str[80];

   printf("Enter sth: ");
   char st1 = gets(str);

   printf("Enter sth: ");
   char st2 = gets(str);

   if(strcpy(st1,st2))
     printf("Same\n");
   else
      printf("Different\n");

  return 0;
}

私の目標は、キーボードから入力した 2 つの文字列が同じかどうかを確認することです。コンパイルすると、いくつかの警告が表示されます。

hello.c: 関数 'main' 内: hello.c:9:16: 警告: 初期化により、キャストなしでポインタから整数が作成されます [デフォルトで有効]

hello.c:12:16: 警告: 初期化により、キャストなしでポインタから整数が作成されます [デフォルトで有効]

hello.c:14:5: 警告: 'strcpy' の引数 1 を渡すと、キャストなしで整数からポインターが作成されます [デフォルトで有効]

/usr/include/string.h:128:14: 注: 'char * restrict ' が必要ですが、引数の型は 'char' です</p>

hello.c:14:5: 警告: 'strcpy' の引数 2 を渡すと、キャストなしで整数からポインターが作成されます [デフォルトで有効]

/usr/include/string.h:128:14: 注: 'const char * restrict ' が必要ですが、引数の型は 'char' です</p>

Enter sth: asd
Enter sth: asd
Output : Segmentation fault (core dumped)

Segmentation Fault 存在しない sth にアクセスしようとするとエラーになることがわかりました。

ここ Stackoverflow で同様の質問とここで少し検索しますが、このコードが機能しない理由がわかりません。ありがとうございました!

4

5 に答える 5

3

char変数のアドレスを文字列として扱い、のstrcpy代わりに使用していますstrcmp。これ:

char st1 = gets(str);
char st2 = gets(str);
if(strcpy(st1,st2))

意図されていた:

char st1[255], st2[255];
scanf("%254s", st1);
scanf("%254s", st2);
if(strcmp(st1, st2) == 0)
于 2013-10-06T16:28:44.323 に答える
2
 if(strcpy(st1,st2))
      ^
      |
    strcmp

strcpy文字列の比較ではなく、文字列のコピー用です。セグメンテーション違反
を取り除くには、 およびに変更します。 char str1char *strchar str2char *str2

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

int main(void)
{
    char str1[80];
    char str2[80];

    printf("Enter sth: ");
    char *st1 = gets(str1);

    printf("Enter sth: ");
    char *st2 = gets(str2);

    if(!strcmp(st1,st2))
        printf("Same\n");
    else
        printf("Different\n");

    return 0;
} 
于 2013-10-06T16:28:30.440 に答える
1

return が原因でコンパイル警告が表示されgets()ますが、 andを as としてchar *宣言します。str1str2char

次のようにする必要があるため、セグメンテーション違反が発生します。

if(strcpy(st1,st2))

で使用する必要があります。質問のタグにstrcmpあるため、タイプミスだと思います:)strcmp

注:を使用しないでください。代わりに使用gets()できます。fgets()

char *st1 = fgets(str, 80, stdin);
于 2013-10-06T16:28:32.947 に答える
0

を使用しようとしていますが、 を使用strcmpしていますstrcpy

このコードはあなたを助けるかもしれません。

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

int main(void)
{
   char str1[80];
   char str2[80];

   printf("Enter sth: ");
   gets(str1);

   printf("Enter sth: ");
   gets(str2);

   if(!strcmp(str1,str2))
     printf("Same\n");
   else
      printf("Different\n");

  return 0;
}
于 2013-10-06T16:32:19.760 に答える
0

コードを修正する方法は次のとおりです。

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

int main(void)
{
   char str[80];
   char str2[80];

   printf("Enter sth: ");
   //notice that gets is not safe,
   //if the line is too long (>79 char), you'll have a buffer overflow
   gets(str);

   printf("Enter sth: ");
   gets(str2);

   //strcmp instead of strcpy
   if(strcmp(str,str2) == 0)
     printf("Same\n");
   else
      printf("Different\n");

  return 0;
}
于 2013-10-06T16:33:34.787 に答える