0

このプログラムは、ASCII 値から 97 を引いて、char 配列 (文字列) を int 配列に変換することになっています (ASCII 値が 97 であるため、入力は小文字でなければなりません)。したがって、文字列 abcd を入力すると、0123 が返されるはずですが、代わりに 012134513789 が返されます。どこに問題があるのか​​わかりません。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

void userEnter(int*pattern, int n);



int main(void)
{
int n, i;
printf("What is the length of the array: ");
scanf("%d",&n);
int pattern[n];
printf("Enter the char array: ");
userEnter(pattern, n);
printf("The int array is: ");
for(i=0;i<n;i++)
{
printf("%d",pattern[i]);
}
printf("\n");

}

void userEnter(int*pattern, int n)
{
    char input[n];
    scanf("%s", input);

    int i;
    for(i = 0; i < n-1; i++)
    {
        pattern[i] = input[i]-97;
    }
}
4

2 に答える 2

1

長さパラメーターnには、null の 1 文字も含まれます。したがって、長さをn4 に入力すると、たとえばabc4 番目が null のため、3 文字しか入力できません。

したがって、それに応じて宣言を変更する必要があります。

変化する:

 char input[n];

に:

 char input[n+1];

可変長配列は C99 以降でのみ使用できることに注意してください。

于 2012-11-16T19:03:03.477 に答える
1
char input[n];
scanf("%s", &input);

する必要があります

char input[n+1];
scanf("%s", input);

inputと同等です&input[0]

userEnterユーザーが入力した文字列を終了するヌル文字に遭遇した場合も、 for ループを終了する必要があります。たとえば、次のようなもので

char* p = input;
while (*p != '\0') {
    *pattern = (*p) - 'a';
    p++;
    pattern++;
}

KingsIndian が指摘しているように、inputバッファーのサイズも大きくする必要があります。現在、そのバッファをオーバーフローさせ、ループ カウンタを上書きしますi

于 2012-11-16T18:45:30.600 に答える