4

誰かが次のコードを説明できますか

#include<stdio.h>
main()
{
    char c[]="abc\nabc";
    puts(c);
}

このコードは期待どおりに生成されます:

abc
abc

しかし、ユーザーからの入力と同じ文字列を取得しようとすると、

#include<stdio.h>
main()
{
    char c[]="abc\nabc";
    gets(c);             // i type in "abc\nabc" 
    puts(c);
}

このコードは以下を生成します:

abc\nabc

プログラムに改行文字を正しく読み取らせるにはどうすればよいですか?

4

2 に答える 2

4

文字通りタイプしまし\nか?

もしそうなら、それはあなたが以下をしたかのように、文字通りあなたの文字列にa\そして次にanを置きました:

char c[] = "abc\\nabc"; /* note the escaped \ */

これは論理的には改行文字ではなく、\その後に。が続きnます。

ユーザー入力でエスケープシーケンスをサポートする場合は、ユーザー入力を後処理して適切なエスケープシーケンスを作成する必要があります。

/* translate escape sequences inline */
for (i = 0, j = 0; c[i] != 0; ++i, ++j) {
   if (c[i] == '\\' && c[i+1] != 0) {
       switch(c[++i]) {
       case 'n':  c[j] = '\n'; break;
       case '\\': c[j] = '\\'; break;
       /* add the others you'd like to handle here */
       /* case 'a': ... */
       default:   c[j] = ' ';  break;
       }
   } else {
       c[j] = c[i];
   }
}

c[j] = 0;
于 2013-01-11T04:08:09.453 に答える
2

文字列リテラルまたは char const として、'\n' は 1 文字であり、\ はエスケープ文字と呼ばれます。ただし、入力としての '\' は 1 つの実文字であり、エスケープ文字ではありません。

于 2013-01-11T04:19:17.583 に答える