我想让这个程序打印字符串,但我无法在输出中看到完整的单词(在控制台中)。将按以下顺序排列: 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:
解决问题之后:
答案 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 +
。答案 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, ...