在输出中看不到完整的单词

时间:2013-07-23 10:45:54

标签: c string pointers

我想让这个程序打印字符串,但我无法在输出中看到完整的单词(在控制台中)。将按以下顺序排列: artictle (例如:“the”,“a”,“one”,“some”,“any”), noun 介词文章名词

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

我一直在考虑这个问题,但我仍然不明白这种行为的原因。请问你能告诉我这个程序有什么问题吗?

#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;
}

BEFORE:

**BEFORE:**

解决问题之后:

enter image description here

3 个答案:

答案 0 :(得分:7)

当您使用例如*article您只传递数组中的 first 字符串。你需要传递整个数组:

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

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

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

打印字符串时,请勿在函数中使用address-of运算符。

答案 1 :(得分:1)

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

要传递数组,请不要使用*中的*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 + 2相同,e是指向字符串第三个字母的指针,您将得到一个简单的控制台中的0 +
  • 请注意,有一些字符串短于3个字符,因此如果碰巧溢出字符串,您可能偶尔会遇到垃圾。
PS:只是出于好奇,所有这些{{1}}的重点是什么?未来参数的占位符?

答案 2 :(得分: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, ...