关于#c语言#的问题

输出字符串中最长的单词,不知道哪里错了


#include 
#include 
int main(){
    char str[100];
    printf("输入字符串:");
    gets(str);
    printf("最长的单词是:");
    int i;
    int letter(char c);
    int longest(char arr[]);
    for(i=longest(str);letter(str[i]);i++){
        printf("%c",str[i]);
    }     
    return 0;
}
int letter(char c){      //判断是否是英文字母 
    if(c>='a'&&c<='z'||c>='A'&&c<='Z') return 1;
    else return 0;
}
int longest(char arr[]){
    int flag=1;//表示将要读入的字母是起始位置的
    int i;
    int point=0;//表示当前单词的起始下标  
    int num=0;//表示当前单词累计的字母个数
    int maxlength=0;//表示最长单词的长度
    int place=0;//表示最长单词的起始位置
    for(i=0;i<strlen(arr);i++){
        if(letter(arr[i])){
            if(flag){
                point=i;
                flag=0;
            }
            num++;
        }
        else {
            flag=1;
            if(num>=maxlength){
                maxlength=num;
                place=point;
            }
            num=0;             
        } 
    } 
    return place; 
}
int longest(char arr[]) {
    int i = 0, start = 0, max_len = 0, max_start = 0;
    int len = strlen(arr);
    
    while (i < len) {
        while (i < len && isspace(arr[i])) {
            i++;
        }
        start = i;
        while (i < len && !isspace(arr[i])) {
            i++;
        }
        int word_len = i - start;
        if (word_len > max_len) {
            max_len = word_len;
            max_start = start;
        }
    }
    return max_start;
}

参考GPT和自己的思路:

你好,这段代码存在若干问题。首先,gets()函数已经被标记为不安全并可能产生缓冲区溢出,不建议使用。建议改用fgets()函数。另外,最长单词的长度应该是maxlength+1,因为需要包括字符串末尾的空字符。最后,在输出最长单词时应该用循环打印,而不是只打印单个字母。

下面是修改后的代码:

#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 100
int main() {
    char str[MAX_LENGTH + 1];
    printf("输入字符串:");
    fgets(str, MAX_LENGTH + 1, stdin);
    printf("最长的单词是:");
    int i;
    int letter(char c);
    int longest(char arr[]);
    int start = longest(str);
    for (i = start; letter(str[i]); i++) {
        printf("%c", str[i]);
    }
    printf("\n");
    return 0;
}
int letter(char c) {      //判断是否是英文字母 
    if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
        return 1;
    else
        return 0;
}
int longest(char arr[]) {
    int flag = 1;        //表示将要读入的字母是起始位置的
    int i;
    int point = 0;       //表示当前单词的起始下标 
    int num = 0;         //表示当前单词累计的字母个数
    int maxlength = 0;   //表示最长单词的长度
    int place = 0;       //表示最长单词的起始位置
    for (i = 0; i < strlen(arr); i++) {
        if (letter(arr[i])) {
            if (flag) {
                point = i;
                flag = 0;
            }
            num++;
        }
        else {
            flag = 1;
            if (num >= maxlength) {
                maxlength = num;
                place = point;
            }
            num = 0;
        }
    }
    return place;
} 
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 请看👉 :c语言输出字符数组出现汉字乱码解决方法
  • 除此之外, 这篇博客: 这些基础的C语言选择题,不知道你能不能拿下中的 🧭进制数与格式化输出 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include<iostream>
    using namespace std;
    
    int main()
    {
    	int m = 0123, n = 123;
    	printf("%o %o\n", m, n);
    	return 0;
    }
    

    程序运行后的输出结果是()
    A 0123 0173
    B 0123 173
    C 123 173
    D 173 173

    正确答案:C
    这题就是C语言常见进制的表示形式以及打印格式化数据的方式
    二进制: 101b
    八进制:0123 printf打印时 %o
    十进制: 101 printf打印时 %d
    十六进制:0x123 printf打印时 %x
    m是八进制,所以直接打印123
    在这里插入图片描述

    以下程序的运行结果是()

    int main()
    {
    	printf("%s , %5.3s\n", "computer", "computer");
    	return 0;
    }
    

    A computer, puter
    B computer,   com
    C computer,   computer
    D computer,   compu.ter

    正确答案:B
    这题考点与上面类似,也是打印格式化的数据
    %m.ns,m表示宽度,n表示打印字符的个数,右对齐,不足补空格,当n大于m时直接打印n个字符。-m就是左对齐,还有%04d右对齐打印,宽度为4,不足补0
    在这里插入图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^