if (ch == '\\')
{
escape_ch = '\\\\';
}
コンパイラは 4 つのバックスラッシュに満足していませんが'\\'
、1 つの文字として作成できるようにする必要があります。C'\\'
は 1 つのバックスラッシュとして読み取ります。'\\\\'
だから私は2つのバックスラッシュとして試しましたが、うまくいきません。プログラムを実装するためにこれが必要です。
if (ch == '\\')
{
escape_ch = '\\\\';
}
コンパイラは 4 つのバックスラッシュに満足していませんが'\\'
、1 つの文字として作成できるようにする必要があります。C'\\'
は 1 つのバックスラッシュとして読み取ります。'\\\\'
だから私は2つのバックスラッシュとして試しましたが、うまくいきません。プログラムを実装するためにこれが必要です。
C の文字は 1 文字しかないため、バックスラッシュを 2 つ入れることはできません。ご希望の内容を説明していただければ、より適切なサポートができるかもしれません。
次のようにして、strstr を使用してトークン化を行うことができます。
tok1 = str;
tok2 = strstr(str, "\\\\");
*tok2 = '\0';
tok2 += 2;
私はあなたが混乱していると思います、そしてあなたがあなたが持っていると思う問題を本当に持っていません。バックスラッシュが表示されたら、「n」をチェックして「\ n」に置き換えますよね?つまり、'\'+'n'->'\n'です。さて、バックスラッシュについても同じことを行いますが、それ自体を置き換えます:'\'+'\'->'\'。
c = getchar();
if (c == '\\') /* escape */
{
c = getchar();
switch( c ):
{
case 'n':
c = '\n';
break;
case 't':
c = '\t';
break;
case '\\':
c = '\\'; /* not even necessary */
break;
...
}
}
/* store c in buffer */
そして、その不要な割り当てを省略することで、自分自身にマップする文字の処理を組み合わせることができます。
switch( c ):
{
case 'n':
c = '\n';
break;
case 't':
c = '\t';
break;
case '\\': case '"': case '\'':
/* these escaped chars map to themselves so don't change c */
break;
/* ... handle other escapes such as \r, \<octal digits> too */
case EOF:
error("premature end of file in escape sequence"); /*write a function, error, that prints a message and a newline on stderr and calls exit(1) */
}
strtok を使用しない場合の解決策は次のとおりです。
for(i=0, j=0, k=-1; i < strlen(str); i++){
if(str[i] == '\\') j++;
else j=0;
if(j == 2){
printf("%d %d\n", k + 1, i - 2);
k = i;
}
}
printf("%d %d\n", k + 1, i - 1);
strncpy()
インデックスを提供し、それを印刷したり、別の文字列に出力したりできます。