c - 打印最长的字符串和字符串长度?

时间:2018-03-09 05:58:24

标签: c

我是c编程的新手,我想编写一个代码来查找字符串数组中最长的字符串和字符串长度。到目前为止,这是我的代码。

#include <stdio.h>
#include <string.h>
#define N 20
char *longestStrInAr(char str[N][40], int size, int *length);
int main()
{
    int i, size, length;
    char str[N][40], first[40], last[40], *p;
    char dummychar;

    printf("Enter array size: \n");
    scanf("%d", &size);
    scanf("%c", &dummychar);
    for (i=0; i<size; i++) {
        printf("Enter string %d: \n", i+1);
        gets(str[i]);
    }
    p = longestStrInAr(str, size, &length);
    printf("longest: %s \nlength: %d\n", p, length);
    return 0;
}
char *longestStrInAr(char str[N][40], int size, int *length)
{
    int i,j=0;
    int len = 0;
    *length = 0;
    char word[N];
    for(i=0;i<size;i++){
        while(str[i][j]!='\0'){
            len++;
            j++;
        }
        if(*length<len){
            *length = len;
            strcpy(word,str[i]);
        }
    }
    return word;
}

main {}是给定的函数,而* longestStrInAr下的代码是我想要编写的代码。但是,我当前的代码只能给我最长的字符串长度,并打印出(null)而不是最长的字符串。 my output

2 个答案:

答案 0 :(得分:1)

将字符串复制到局部变量中,然后返回指向它的指针。但是在返回之后,变量不再有效。这是未定义的行为和&#34;任何&#34;可以发生。在这种情况下,似乎某些优化或调试助手将其变为null。

而是只保留指向str数组中最长字符串的指针,不要复制任何内容并返回该指针。或者,如果要简化它,请返回最长字符串的i索引。

答案 1 :(得分:1)

我看到的问题:

问题1

请勿使用gets。这是一个安全漏洞。请改用fgets

fgets(str[i], 40, stdin);

问题2

word使用的尺码不正确。它的大小必须为40

char word[40];

问题3

您正在返回指向word的第一个元素的指针 longestStrInArr。但是,一旦函数返回,该内存无效。因此,您的程序有不确定的行为。

您可以通过返回str中最长字符串的索引或通过提供足够长的输入参数来保存最长的字符串来修复它。

size_t longestStrInAr(char str[N][40], int size, int *length)
{
   size_t index = 0
   size_t i,j=0;
   int len = 0;
   *length = 0;

   for(i=0;i<size;i++){
      while(str[i][j]!='\0'){
         len++;
         j++;
      }
      if(*length<len){
         *length = len;
         index = i;
      }
   }
   return index;
}

然后将其用作:

size_t index = longestStrInAr(str, size, &length);
printf("longest: %s \nlength: %d\n", str[index], length);