1

C でコード コピー文字列

#include <stdio.h>
char *copyString(char *,char *);
void main()
{
    char *first = (char *)calloc(sizeof(char),10);
    char *second = (char *)calloc(sizeof(char),10);
    printf("Enter first string:\t");
    scanf("%s",first);
    printf("%s",copyString(first,second));
}
char *copyString(char *a,char *b)
{
    int i=0;
    while(*(a+i)!='\0')
    {
        *(b+i)=*(a+i);
        i++;
    }
    *(b+i)='\0';
    return b;
}

Case 1:


入力:こんにちは

出力:こんにちは

Case 2:


入力:ハローワールド

出力:こんにちは

それで、私の質問は??spaceと見なされるかどうかです。newline/null2番目のケースでは、このように表示されるため..

4

7 に答える 7

9

デフォルトでscanfは、空白文字が検出されると標準入力ストリームの読み取りを停止' 'します。それを修正するには、スキャンセットを使用できます。

scanf("%[^\n]", first);
于 2012-11-06T17:05:02.400 に答える
2

scanf()デフォルトでは、最初の空白の後に読み取りを停止します。fgets()またはgets()[安全でない]を使用してください。なぜこのようになっているのかについては、次の POSIX ページを参照してください: http://www.unix.com/man-page/POSIX/3posix/scanf/および ISO C 規格: http://www .open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf . scanf()and fscanf()(および他のすべての標準 C 関数) がどのように機能するかについての長い説明があります。これらは一般的に、C ライブラリの関数がどのように機能するかについてのガイドラインに従います

すべてのコンパイラは、ほとんどの UNIX プラットフォームで同じように機能する POSIX 準拠の標準 c ライブラリを作成するために懸命に努力しています。

標準の C 関数は実際にここで定義されています: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

于 2012-11-06T17:05:54.407 に答える
1

文字列を入力すると、空白の後に読み取りが停止するためです。したがって、実際には文字列にはあり"Hello"ますが、 ではありません。first"Hello world"

fgets()行全体を読み取るために使用します。

于 2012-11-06T17:06:31.707 に答える
1

提案されているように、最初の空白で停止するため、代わりに使用して行全体を読み取るscanfことができます。fgets「Hello World」は 10 バイトではなく 12 バイトであるため、より多くのスペースを割り当てます。

于 2012-11-06T17:06:48.897 に答える
0

スキャンscanfする 2 つの文字列に対して 1 つの文字列だけをスキャンしています。次のように記述します。

      scanf("%s %s",first,second);

同様に、より多くの文字列をスキャンするには、スキャンしたい文字列と同じ数を与えるようにする必要があります%s

于 2012-11-06T17:08:12.920 に答える
0

ここでの scanf 関数は、空白に遭遇するまで入力を読み取ります。readline 関数を実装する必要があります。

于 2012-11-06T17:10:35.533 に答える
0

#include を使用して、string.h lib のこの関数 strcpy を利用します。次に例を示します。

    strcpy(first, second);

これはうまくいくはずです。

于 2012-11-06T17:12:59.490 に答える