我被分配了用 C 语言编写生产者/消费者程序的任务。生产者过程方法如下所示,它试图从用户输入的字符串 (producerString
) 中捕获元音。但是,我无法测试是否正确创建了 vowelString
。
我确定该方法运行完成,但在执行第二个 printf
时没有打印任何内容。它与我如何打印指针有关吗?
char * Producer(char producerString[]) //PRODUCER FUNCTION
{
char *vowelString = (char *) malloc(sizeof(char) * 100);
vowelString = ""; //String used to append vowels to
printf("In Producer with producerString = %s\n", producerString);
for (int i = 0; producerString[i] != '\0'; i++)
{
if (producerString[i] == 'a' || producerString[i] == 'e' || producerString[i] == 'i' || producerString[i] == 'o' || producerString[i] == 'u' || producerString[i] == 'y')
{
int len = strlen(vowelString);
vowelString[len] = i;
vowelString[len + 1] = '\0';
}
else if (producerString[i] == 'p')
{
exit(0);
}
}
printf("In Producer with vowelString = %s\n", vowelString);
return vowelString; //Return vowels string
}
我也尝试在从 Producer 方法返回后在 Main 方法中打印它,方法如下:
char *producedString = Producer(inString);
printf("The produced string: %s\n", producedString);
这也不起作用,但我认为这是同一问题的结果。
在此先感谢您的帮助,并感谢任何其他提示。
最佳答案
vowelString = "";
不是您初始化动态分配字符串的方式。这是指派指针指向静态文字字符串,它不再指向 malloc 的内存。文字字符串不可修改,因此当您写入 vowelString[i]
时会导致未定义的行为。
将该行更改为:
vowelString[0] = '\0';
此外,
vowelString[len] = i;
应该是:
vowelString[len] = producerString[i];
但不是每次循环都调用 strlen()
,您可以在函数开始时简单地将 len
初始化为 0
, 并在每次添加元音时增加它。
char * Producer(char producerString[]) //PRODUCER FUNCTION
{
char *vowelString = (char *) malloc(sizeof(char) * 100);
printf("In Producer with producerString = %s\n", producerString);
int len = 0;
for (int i = 0; producerString[i] != '\0'; i++)
{
if (producerString[i] == 'a' || producerString[i] == 'e' || producerString[i] == 'i' || producerString[i] == 'o' || producerString[i] == 'u')
{
vowelString[len++] = producerString[i];
}
else if (producerString[i] == 'p')
{
exit(0);
}
}
vowelString[len] = '\0';
printf("In Producer with vowelString = %s\n", vowelString);
return vowelString;
}
关于c - 为什么不打印我的 char 数组指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47404017/