我需要编写一个函数来打印字符串中以指定字母开头的单词。我的问题是,一旦我尝试打印单词,该函数就永远不会停止。
这是代码:( printWords是函数,printWord是帮手)
#include <stdio.h>
#include <string.h>
typedef char string[50];
void printWord(int *index, string sentence)
{
while (sentence[*index] != ' ' || sentence[*index] != '\0')
{
printf("%c", sentence[*index]);
*index += 1;
}
}
void printWords(char letter, string sentence)
{
int i = 0, *iPtr = &i;
if (sentence[0] == letter || sentence[0] == letter + 32)
printWord(iPtr, sentence);
for (; sentence[i] != '\0'; i++)
if ((sentence[i] == ' ' && sentence[i+1] == letter) || (sentence[i] == ' ' && sentence[i+1] == letter + 32))
printWord(iPtr, sentence);
}
void main()
{
char ex1_letter;
int menu;
string ex1_sentence;
printf("\n\nPlease enter a string: ");
gets(ex1_sentence);
printf("\nPlease enter a letter: ");
scanf("%c", &ex1_letter);
printWords(ex1_letter, ex1_sentence);
}
循环中的条件似乎永远不会发生,我只是不知道为什么.. 任何帮助将不胜感激!
答案 0 :(得分:2)
您的主要错误是在||
中&&
使用了printWord
。对于||
,条件将始终为真,因为字符始终不是空格或空字符。
其他一些观点:
main
返回int
(并且最后有一个return 0;
)更容易移植。
不鼓励使用gets
,因为它允许缓冲区溢出。 fgets
更安全,但请注意它将换行符留在字符串的末尾。
不要做letter + 32
之类的事情。而是使用ctype.h
中的函数。在这种情况下,请使用tolower
或toupper
。
不要将i
作为指针传递,只需将其作为int
传递并返回更改后的值。
请勿使用printf
和scanf
来打印/扫描单个字符。而是使用putchar
和getchar
。
使用++i
代替i += 1
。
你的typedef
只是模糊了一些东西。如果(例如)printWords
的声明是void printWords(char letter, char *sentence)
,则C程序员立即知道发生了什么,而不必知道string
是什么。 typedef
确实没有增加任何内容。
答案 1 :(得分:1)
在printWord
方法中:
while (sentence[*index] != ' ' || sentence[*index] != '\0')
此条件始终为true
。将其更改为&&
:打印只要它不是空格而不是字符串的结尾,如下所示:
while (sentence[*index] != ' ' && sentence[*index] != '\0')