编程以查找字符串中最长的单词

时间:2018-06-15 09:01:49

标签: c string loops

我编写了一个程序来查找字符串中最长的单词并打印最长单词中的字母数。但代码不是打印。我多次分析了该程序,但我找不到解决方案。

#include <stdio.h>
#include <string.h>

int main() {
    char string[100] = "Hello Kurnool";
    int i = 0, letters = 0, longest = 0;

start:

    for (; string[i] !=' '; i++) {
        letters++;  
    }

    if (letters >= longest)
        longest = letters;

    if (string[i] == ' ') {
        letters = 0;
        i++;
        goto start;
    }

    printf("%d", longest);

    return 0;
} 

5 个答案:

答案 0 :(得分:8)

强烈建议不要使用goto。您应该将代码转换为使用循环。

代码中的主要问题是当您到达字符串末尾时不要停止扫描。

以下是修改后的版本:

#include <stdio.h>

int main() {
    char string[100] = "Hello Kurnool";
    int i, letters, longest = 0, longest_pos = 0;

    for (i = 0; string[i] != '\0'; i++) {
        for (letters = 0; string[i] != '\0' && string[i] != ' '; i++) {
            letters++;  
        }
        if (letters > longest) {
            longest = letters;
            longest_pos = i - longest;
        }
    }    
    printf("longest word: %d letters, '%.*s'\n",
           longest, longest, string + longest_pos);

    return 0;
}

请注意,实现可以简化为单个循环:

#include <stdio.h>

int main() {
    char string[100] = "Hello Kurnool";
    int i, start = 0, longest = 0, longest_pos = 0;

    for (i = 0; string[i] != '\0'; i++) {
        if (string[i] == ' ') {
            start = i + 1;
        } else {
            if (i - start > longest) {
                longest = i - start;
                longest_pos = start;
            }
        }
    }    
    printf("longest word: %d letters, '%.*s'\n",
           longest, longest, string + longest_pos);

    return 0;
}

答案 1 :(得分:2)

以下是我的方法。你应该使用C的字符串操作函数。这是处理C语言中字符串的正确方法。

在下面的代码中,首先我获取了将输入字符串存储在堆中所需的字节。然后我使用strtok基于delemeter将字符串拆分为标记,并获取每个子字符串的长度。最后,我释放了我用malloc分配的空间。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define phrase "Hello Kurnool"
int main()
{
    char* string = malloc(strlen(phrase)+1);
    strcpy(string,phrase);
    int longest=0;
    char *token;
    char delimeter[2] = " ";

   /* get the first token */
   token = strtok(string, delimeter);

   /* walk through other tokens */
    while( token != NULL ) {
        printf( " %s\n", token );
        if(longest < strlen(token)){
            longest = strlen(token);
        }
        token = strtok(NULL, delimeter);
   }
    printf("%d",longest);
    free(string);
    return 0;
}

答案 2 :(得分:1)

人们说 - dont use gotogoto没有任何内在错误。唯一的问题是如果不明智地使用goto,它会使代码更难以理解和维护。例如,你在程序中使用它的方式(而不是goto,在这种情况下循环是完美的)。检查一下:
To use goto or not?
What is wrong with using goto?

来到您的代码,for循环条件没有检查是否终止空字符

for (; string[i] !=' '; i++) {

因此它不会在字符串的末尾停止 要查找最长字符串中的字母数,您可以执行以下操作:

#include <stdio.h>
#include <string.h>

int main() {
    char string[100] = "Hello Kurnool";
    int i, letters = 0, longest = 0;

    for (i = 0; string[i] != '\0'; i++) {
        if (string[i] != ' ') {
            letters++;
            if (letters > longest) {
                longest = letters;
            }
        } else {
            letters = 0;
        }
    }

    printf("longest : %d\n", longest);

    return 0;
}

答案 3 :(得分:0)

首先,请避免使用Goto,这不是一个好习惯。

其次,你的循环在第二次迭代时会运行无限次,因为:

for(;string[i]!=' ';i++) // Here String[i] will never be equal to ' ' As there is no white space after your last word.

答案 4 :(得分:0)

如果你正在使用

,你永远不能指望你的程序可能出现什么问题
  

转到声明

如果您使用它,那么从不建议使用它,而不是编程错误。其次,看起来你陷入无限循环,所以她是你问题的解决方案:

#include<stdio.h>
#include<string.h>
void main()
{
    char s[1000];
    scanf("%s",s);
    int i=0;
    int letters;
    int longest=0;
    while(s[i]!=NULL)
   {
      if(s[i]==' ')
      {
         if(longest>=letters)
              {longest=letters;}
         letters=0;
       }
      else
         {letters++;}
    }
printf("%d\n",longest);
}

所以,我所做的是假设一个字符串s,它是用户给出的输入。你通过s迭代直到用户给出的最后一个输入,然后它遇到一个NULL字符。现在您正在搜索最长单词的长度,因此您可以创建一个变量字母来计算no。字符串的每个单词中的字母。如果字符串s遇到表示单词结尾的空格,则检查变量最长是否大于或小于单词计数。再次将字母初始化为0,以便它可以再次从0开始计算下一个单词。因此,通过此方法结束,即 while 循环终止后获取存储在变量最长中的所需输出。 所以,我想这会打印出来的。最长的单词中的字母。