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

char print_two(char *reg, char *s)
{
    int i, l_s = (int) strlen(s), l_reg = (int) strlen(reg);
    for(i = 0; i < l_reg; i++)
    {
        printf("\n %c \n", reg[i]);
    }
    return 0;
}

int main(void)
{
    char reg;
    printf("Give a rule: ");
    scanf("%s", &reg);

    char s;
    printf("Give a string: ");
    scanf("%s", &s);

    print_two(&reg, &s);
    return 0;
} 

プログラム開始:

Give a rule: qwert
Give a string: asdf
result:
d
q
a
s
d
f

regによる上書きを回避するにはどうすればよいsですか?

realloc、malloc-0エフェクトで試してみました。

2つの変数は動的である必要があります。

できますか?


ユーザーは55文字を与える->配列55

ユーザーが100文字を与える->配列100

4

3 に答える 3

3

他の回答へのコメントに基づいて、GNUライブラリ拡張機能(主にLinuxまたはWindows MinGW)を使用%msしても問題がない場合は、次のようなscanf形式の文字列で使用できます。

char *reg = NULL; // set to NULL to get segfault on uninitialized use
printf("Give a rule: ");
scanf("%ms", &reg); // scanf will malloc enough space to reg

// check for null in case scanf failed to read anything for some reason
// could also check return value of scanf, which is number of items it got
if (reg != NULL) {
  // process reg
}

free(reg); // free(NULL) is not an error, it just does nothing
reg = NULL; // set to NULL to get segfault on uninitialized use

他の回答は、標準Cである固定サイズのバッファーの使用方法を示しています。man scanf注のセクションによると%ms、将来のPOSIX標準になる可能性があります。GNUにも古い%asものがありますが、%msサポートされている場合(つまり、最新のGNUシステムの場合)に優先する必要があります。

于 2013-01-28T16:09:52.633 に答える
2

scanf("%s", ...)stdinから文字列を読み取っています。変数regとsは、完全な文字列ではなく、1つの文字にストレージを割り当てています。char reg[128]たとえば、入力文字列の長さが最大128文字になる場合は、これを変更する必要があります。バッファオーバーフローを防ぐために、scanfでスキャンされる入力の長さを。を使用して制限することも検討する必要がありますscanf("%127s", ...)

于 2013-01-28T15:58:12.357 に答える
0

文字列(複数の文字)を。のように1つの文字に読み込むことはできませんchar s

より多くのスペースを予約する必要があります。

char reg[128], s[128];

そうしないと、メモリ内のランダムなものが上書きされ、未定義の動作が発生します。

于 2013-01-28T15:55:39.803 に答える