仅以C语言打印以字符串形式开头的单词

时间:2014-05-12 15:55:28

标签: c string pointers char printf

我需要编写一个函数来打印字符串中以指定字母开头的单词。我的问题是,一旦我尝试打印单词,该函数就永远不会停止。

这是代码:( 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);
}

循环中的条件似乎永远不会发生,我只是不知道为什么.. 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您的主要错误是在||&&使用了printWord。对于||,条件将始终为真,因为字符始终是空格或空字符。

其他一些观点:

main返回int(并且最后有一个return 0;)更容易移植。

不鼓励使用gets,因为它允许缓冲区溢出。 fgets更安全,但请注意它将换行符留在字符串的末尾。

不要做letter + 32之类的事情。而是使用ctype.h中的函数。在这种情况下,请使用tolowertoupper

不要将i作为指针传递,只需将其作为int传递并返回更改后的值。

请勿使用printfscanf来打印/扫描单个字符。而是使用putchargetchar

使用++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')