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

C 在输出中看不到完整单词,c,string,pointers,C,String,Pointers,我想让这个程序打印字符串,但我在控制台的输出中看不到完整的单词。单词的顺序是:artittle(例如:“the”,“a”,“one”,“some”,“any”),名词,介词,冠词,名词 如果我在不使用函数的情况下打印该字符串,它将正常工作。但是如果我使用我的函数,输出是不正确的 我想了很长时间了,但是我仍然不明白这种行为的原因。你能告诉我这个程序有什么问题吗 #include <stdio.h> #include <stdlib.h> #include <strin

我想让这个程序打印字符串,但我在控制台的输出中看不到完整的单词。单词的顺序是:artittle(例如:“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;
}
#包括
#包括
#包括
#包括
int打印句子(int数字、const char*文章、const char*名词、const char*动词、const char*介词);
int main(){
整数;
const char*article[5]={“the”、“a”、“one”、“some”、“any”};
const char*名词[5]={“男孩”、“女孩”、“狗”、“城镇”、“汽车”};
const char*动词[5]={“开车”、“跳”、“跑”、“走”、“跳过”};
const char*介词[5]={“to”,“from”,“over”,“on”,“under”};
srand((无符号)时间(NULL));
/*正常工作*/
printf(“%s”,文章[0+rand()%4]);
printf(“%s”,名词[0+rand()%4]);
printf(“%s”,动词[0+rand()%4]);
printf(“%s”,介词[0+rand()%4]);
printf(“%s”,文章[0+rand()%4]);
printf(“%s\n”,名词[0+rand()%4]);
printf(“现在我使用函数:\n”)
printf(“输入要生成的句子数(输入1):\n”);
scanf(“%d”和编号);
/*不能正常工作*/
印刷句(数字、*冠词、*名词、*动词、*介词);
返回0;
}
int打印句子(int num,const char*a,const char*n,const char*v,const char*p){
int i;
对于(i=0;i
之前:

解决问题后:

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

要传递数组,请不要像在
*文章中那样使用
*
,只需使用它们并让它们衰减为指针:

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”
    。假设随机数为2,您将打印
    &a[2]
    ,即
    &*(a+2)
    ,这与
    a+2
    相同,后者是指向字符串第三个字母的指针,您将在控制台中得到一个简单的
    e
  • 请注意,有几个字符串短于3个字符,因此如果您碰巧使字符串溢出,您可能偶尔会收到垃圾

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

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

    printSentence(number, article, noun, verb, preposition);
    
    当然,您需要更改函数声明:

    int printSentence(int number, const char **article, const char **noun, const char **verb, const char **preposition);
    
    打印字符串时,不要在函数中使用运算符的地址。

    in

    int printSentence(int num, const char *a, ...
    
    a
    应该是什么?它应该是一个
    常量char*
    数组,对吗?这就是
    文章
    的类型,您希望它是相同的

    因此,它应该看起来像:

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


    @朱利安赫勒夫诺伊:如果你修改了代码,但仍然不起作用,你应该用新的代码更新问题,否则我们将无法知道是什么问题。不,谢谢。问题在于将
    *文章
    而不是
    **文章
    传递给函数。@JulianKhlevnoy:这没有意义<代码>**文章
    只是一个常量字符!我的意思是我需要通过整个数组。@YulianKhlevnoy:在C中,你永远不会通过整个数组。将衰减的数组传递给指向第一个元素的指针。传递整个数组的唯一方法是将其嵌入结构中。然后,无论如何,你都应该把结构作为指针传递……你说的“输出不正确”是什么意思。给我们举一些例子!!!(但它不正确的原因是您正在索引字符串,而不是数组,因此您将从数组中间打印字节。)@HotLicks,我说的是“非完整字符串”。问题解决了。但是等等。。。我用图片更新了它,这样其他人会很快理解这个问题。
    int printSentence(int num, const char **a, ...