为什么我输入几个字符串无法进行排序而是显示出的小方框?


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

int main()
{
    char a[5][110],t[11];
    int i,j;
    for (i=0;i<=4; i++){
        gets(a[i]);
    }
    for (i=0;i<=4;i++){
        for (j=i+1 ;j<=5; j++){
            if (strcmp(a[i],a[j])>0){
                strcpy (t, a[i]);
                strcpy (a[i],a[j]);
                strcpy (a[j],t);
                }
            }
        }
        for (i=0;i<=4;i++){
            puts(a[i]);
        }
        return 0;
    }
    

gets(a[i]);的gets()是从缓冲区读取字符,此时你的缓冲区没有数据,所以程序在等待缓冲区的数据(从控制台输入就是将数据存入缓冲区)

gets函数的问题吧,可能是缓冲区溢出了吧

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

int main() {
    char a[5][110], t[110]; // 注意这里的缓冲区大小要和 fgets 一致
    int i, j;
    
    for (i = 0; i < 5; i++) {
        fgets(a[i], sizeof(a[i]), stdin); // 使用fgets读取字符串
    }

    for (i = 0; i < 5; i++) {
        for (j = i + 1; j < 5; j++) {
            if (strcmp(a[i], a[j]) > 0) {
                strcpy(t, a[i]);
                strcpy(a[i], a[j]);
                strcpy(a[j], t);
            }
        }
    }

    for (i = 0; i < 5; i++) {
        fputs(a[i], stdout); // 使用fputs输出字符串
    }
    
    return 0;
}


修改如下,改动处见注释,供参考:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    char a[5][110], t[110]; //t[11];  修改
    int i, j;
    for (i = 0; i <= 4; i++) {
        gets(a[i]);
    }
    for (i = 0; i < 4; i++) {  //for (i = 0; i <= 4; i++)   修改
        for (j = i + 1; j < 5; j++) {  //for (j = i + 1; j <= 5; j++)  修改
            if (strcmp(a[i], a[j]) > 0) {
                strcpy(t, a[i]);
                strcpy(a[i], a[j]);
                strcpy(a[j], t);
            }
        }
    }
    for (i = 0; i <= 4; i++) {
        puts(a[i]);
    }
    return 0;
}

【以下回答由 GPT 生成】

问题的原因是字符数组 a 的初始化大小不足以容纳输入的字符串。这导致字符串被截断并显示为小方框。为了解决这个问题,需要将 char a[5][110] 修改为 char a[5][111],确保每个字符串都能完整存储。

以下是修改后的代码:

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

int main()
{
    char a[5][111], t[111];
    int i, j;
    for (i = 0; i <= 4; i++){
        fgets(a[i], 111, stdin); // 使用 fgets 替换 gets 函数
    }
    for (i = 0; i <= 4; i++){
        for (j = i + 1; j <= 4; j++){ // 修改循环条件
            if (strcmp(a[i], a[j]) > 0){
                strcpy(t, a[i]);
                strcpy(a[i], a[j]);
                strcpy(a[j], t);
            }
        }
    }
    for (i = 0; i <= 4; i++){
        puts(a[i]);
    }
    return 0;
}

请注意,我还替换了 gets 函数,使用 fgets 函数接收输入字符串,以避免潜在的缓冲区溢出问题。



【相关推荐】



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