0

プログラムを通常の配列表記から純粋なポインター表記に変更していますが、while ループで getchar() を使用してユーザー入力を受け取ることができません。プログラムが受信していたものを印刷すると、逆さまの疑問符が出力されました。変数の型を変更したことがないため、なぜこれが起こっているのかわかりませんでした。問題は、ユーザー入力を受け取る 2 番目の関数にあります。お手伝いありがとう。

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

/* Function prototypes */
void fillS1(char * x);

void fillS2(char * x, char * y, char z);

void strFilter(char * a, char * b, char c);

int main(int argc, const char * argv[])
  {
    char s1[42];
    char s2[22];
    char x = 0;

    fillS2(s2, s1, x);

    return 0;
}

/* Function to generate a random string of 40 uppercase letters */
void fillS1(char randomlyGeneratedString[])
{
char * pointerToRandom = randomlyGeneratedString;
int i;

for (i = 0; i < 40; i++) {
    *(pointerToRandom + i) = 'A' + rand() % 26;
}
pointerToRandom[40] = (char)0;

//printf("This is the generated string %s\n", pointerToRandom);

}

/* Function to get user input of characters */
void fillS2(char userString[], char randomString[], char replacementCharacter)
{

char * pointerToUserString = userString;
char * pointerToRandom = randomString;


int i = 0;
int n = 0;
int capitalLetterCheck = 0;

char loopContinue = 0;
char copyString[42];

char * pointerToCopyString = copyString; 

fillS1(pointerToRandom);

do {

    /* For loop to copy the first randomly generated string */
    for(i = 0; i < 42; i++)
        *(pointerToCopyString + i) = *(pointerToRandom + i);

    i = 0;
    capitalLetterCheck = 0;

    /* While loop to to get user input */
    printf("Please enter at least 2 capital letters and a maximum of 20.\n");
    while  (((*(pointerToUserString + i)) = getchar() != '\n'))  {

        /* Counter to determine how many characters were entered */
        i++;

    }

    i++;

    *(pointerToUserString + i) = '\0';

    //printf("This is the value if i %i", i);
    //printf("This is the user's string %s", pointerToUserString);

    /* Capital letter check */
    for (n = 0; n < 20; n++) {
        if (((*(pointerToUserString + i)) >= 'A') && (*(pointerToUserString + i) <= 'Z'))                  
   {          
            capitalLetterCheck++;
        }
    }

    if (i < 3) {
        printf("You need at least two letters\n");
    }

    else if (i > 21){
        printf("You cannot have more than twenty letters\n");
    }

    else if (capitalLetterCheck >= 2) {

        puts(pointerToUserString);

        printf("Enter a character to replace occuring letters.\n");
        scanf("%c", &replacementCharacter);
        getchar();

        strFilter(pointerToCopyString, pointerToUserString, replacementCharacter);

    }

    else

        printf("You  must have 2 capital letters.\n");


    printf("Would you like to enter another string (y/n)?\n");
    loopContinue = getchar();
    getchar();


} while (loopContinue != 'n' && loopContinue != 'N');

}

/* Function to replace letters with the character chosen by the user */
void strFilter(char a[], char b[], char c)
{
char * pointerToA = a;
char * pointerToB = b;


int i = 0;
int n = 0;

while (n < 20) {

    for (i = 0; i < 40; i++) {
        if ((*(pointerToA + i)) == *(pointerToB + n)){
            *(pointerToA + i) = c;
        }
    }
    i = 0;
    n++;
}

puts(a);
}
4

1 に答える 1

5

問題は、ifステートメントの次のとおりです。

(*(pointerToUserString + i)) = getchar() != '\n'

割り当ては式であり、比較よりも優先順位が低くなります。これは、上記が次と同じであることを意味します。

(*(pointerToUserString + i)) = (getchar() != '\n')

したがって、あなたが望むものではない(*(pointerToUserString + i))式の値が割り当てられます。getchar() != '\n'

于 2012-11-06T08:14:32.903 に答える