2017-05-20 8 views
0
#include<stdio.h> 

int main(){ 
    char a[20],*p; 
    p=a; 
    printf("Enter the String"); 
    scanf("%s",p); 
    printf("\n\n%s\n",p); 
    printf("Copying the String\n"); 
    char b[20],*pp; 
    pp=b; 
    while((*pp++=*p++)); 
    printf("\n%s\n",pp); 

} 

このコードは文字列をコピーしていません。しかし、b [20]をb [10]に変更すると、文字列の最後の9文字がコピーされます。ちなみに、私がb [10]を設定し、入力がスペースで構成されている場合、それは文字列をコピーしていません。scanf()からソース文字列を読み込んだ後、文字列がコピーされません。

コンパイラのセットアップ: で構成:--prefix = /ライブラリ/開発/ CommandLineToolsは/ usr --with-GXX-含ま-DIR/=は/ usr/C++/4.2.1 アップルLLVMのバージョン8.1.0が含まれます(打ち鳴らす-802.0.42) ターゲット:x86_64版 - アップルdarwin16.5.0 スレッドモデル:POSIX InstalledDir:/ライブラリ/開発/ CommandLineToolsは/ usr/binに

+0

なぜ、C++タグを使いますか? –

答えて

2

後:

while((*pp++=*p++)); 

ppです文字列の最後を指しています。あなたは欲しい:

 printf("\n%s\n",b); 
+0

b []が10のとき、セグメンテーション・フォールトは発生しませんか?私は長い文字列を渡したとき、最後の9文字が印刷されていた、私は彼らが配列の制限を渡していると仮定します。 –

+0

@Shan配列の境界を超えると、未定義のビヘイビアが表示されます。セグメンテーションフォールトなどの保証はありません。 –

+0

b [10]を使用し、小さな文字列(4文字)を渡すと、4文字が返されました。しかし、あなたが言ったように、ポインタはnullを指している必要がありますし、どの文字も印刷することはできません –

関連する問題