-1

我想让这个程序打印字符串,但我在输出中看不到完整的单词(在控制台中)。将按此顺序出现单词:冠词(例如:“the”、“a”、“one”、“some”、“any”)、名词介词冠词名词

如果我在不使用函数的情况下打印该字符串,则它可以正常工作。但是如果我使用我的函数,输出是不正确的。

我想了很久,但我还是不明白这种行为的原因。你能告诉我这个程序有什么问题吗?

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

int printSentence(int number, const char *article, const char *noun, const char *verb, const char *preposition);

int main(){

    int number;

    const char *article[5] = {"the", "a", "one", "some", "any"};
    const char *noun[5] = {"boy", "girl", "dog", "town", "car"};
    const char *verb[5] = {"drove", "jumped", "ran", "walked", "skipped"};
    const char *preposition[5] = {"to", "from", "over", "on", "under"};

    srand((unsigned)time(NULL));

    /* works properly */
    printf("%s ",  article[0 + rand() % 4] );
    printf("%s ",  noun[0 + rand() % 4] );
    printf("%s ",  verb[0 + rand() % 4] );
    printf("%s ",  preposition[0 + rand() % 4] );
    printf("%s ",  article[0 + rand() % 4] );
    printf("%s\n", noun[0 + rand() % 4] );


    printf("And now I use function:\n")
    printf("Enter the number of sentences to generate (enter 1): \n");
        scanf("%d", &number);
    /* won't work properly */
    printSentence(number, *article, *noun, *verb, *preposition);


    return 0;
}

int printSentence(int num, const char *a, const char *n, const char *v, const char *p){

    int i;

    for (i = 0; i < num; i++){

        printf("%s ",  &a[0 + rand() % 4] );
        printf("%s ",  &n[0 + rand() % 4] );
        printf("%s ",  &v[0 + rand() % 4] );
        printf("%s ",  &p[0 + rand() % 4] );
        printf("%s ",  &a[0 + rand() % 4] );
        printf("%s\n", &n[0 + rand() % 4] );
    }

    return 0;
}

前:

**前:**

解决问题后:

在此处输入图像描述

4

3 回答 3

7

当您使用 eg 调用该函数时,*article您只传递数组中的第一个字符串。您需要传递整个数组:

printSentence(number, article, noun, verb, preposition);

然后,您当然需要更改函数声明:

int printSentence(int number, const char **article, const char **noun, const char **verb, const char **preposition);

并且在打印字符串时不要在函数中使用地址操作符。

于 2013-07-23T10:49:18.230 回答
1

rand() % 4表达式将给出 0、1、2 或 3,但绝不会给出 4。您将错过最后一个。如果你有 5 个元素rand() % 5

要传递数组不要使用*as in *article,只需使用它们并让它们衰减为指针:

printSentence(number, article, noun, verb, preposition);

必须声明该函数以获取指针数组或指针指针,它们在这里是同义词,因此请选择您喜欢的:

int printSentence(int num, const char **a, const char *n[], const char **v, const char *p[])

要打印它,只需使用指向指针的指针,就好像它是一个数组:

printf("%s ",  a[0 + rand() % 5] );

更新:一个小小的解释来理解你的代码得到了什么:

  • 当您传递*article给函数时,您实际上是在传递数组的第一个元素。请注意,数组通常会衰减为指针,因此与和article[0]相同。那简直了。*(article + 0)*article"the"
  • 您的函数获取字符串"the"。假设随机数为 2,您将打印与指向字符串第三个字母的指针相同的&a[2]那个,您将在控制台中得到一个简单的值。&*(a + 2)a + 2e
  • 请注意,有一些字符串短于 3 个字符,因此如果您碰巧溢出字符串,您可能偶尔会得到垃圾。

PS:只是出于好奇,所有这些有什么意义0 +?未来争论的占位符?

于 2013-07-23T10:48:01.473 回答
1

int printSentence(int num, const char *a, ...

a 应该是什么?它应该是一个数组const char *,对吧?这就是类型article所具有的,并且您希望它是相同的。

所以,它应该看起来像:

int printSentence(int num, const char *a[], ...

或者

int printSentence(int num, const char **a, ...
于 2013-07-23T10:52:32.217 回答