吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1377|回复: 9
收起左侧

[已解决] C 循环读取一行字符

[复制链接]
ing 发表于 2020-3-7 21:56
本帖最后由 ing 于 2020-3-9 17:27 编辑


我实在不知道该怎么解决好了
捕获.PNG


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

#define MAX_STRINGS 20
#pragma pack(1)

void main()
{
        int n = 3;
        char **a = (char**)malloc(n*sizeof(char*));

        printf("输入三个字符串\n");
        for (size_t i = 0; i < n; i++)
        {
                /*fgets(a[i], MAX_STRINGS, stdin);*/
                scanf_s("%s",&a[i]);
        }

        for (size_t i = 1; i < n; i++)
        {
                for (size_t j = 1; j < n; j++)
                {
                        if (a[j]<a[j - 1])
                        {
                                char **temp = a[j - 1];
                                a[j-1] = a[j];
                                a[j] = temp;
                        }
                }
        }

        for (size_t i = 0; i < n; i++)
        {
                printf("%s\n", a[i]);
        }

        free(a);

        return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

古月不傲 发表于 2020-3-7 22:03
[C] 纯文本查看 复制代码
__try
	{
		const char **p = (const char **)malloc(3 * sizeof(const char*));
		for (int i = 0; i < 3; i++)
		{
			p[i] = (const char *)malloc(32);
		}
		for (int i = 0; i < 3; i++)
		{
			scanf_s("%s", p[i], 32);
		}
		for (int i = 0; i < 3; i++)
		{
			printf("%s\n", p[i]);
		}
	}
风狄 发表于 2020-3-7 22:14
cry323 发表于 2020-3-7 23:34
 楼主| ing 发表于 2020-3-8 00:03
古月不傲 发表于 2020-3-7 22:03
[mw_shl_code=c,true]__try
        {
                const char **p = (const char **)malloc(3 * sizeof(const char*));


a[0] = "qwer";
a[1] = "asdf";
a[2] = "zxcv";
在这里 a[1] 应该是小于a[0] 的,我不知道发生了什么这个判断却变了,头疼,上个帖子运行这代码的时候还不是这样的
捕获.PNG


int n = 3;
    char **a = (char**)malloc(n*sizeof(char*));

    printf("输入三个字符串\n");    

    a[0] = "qwer";
    a[1] = "asdf";
    a[2] = "zxcv";

    if (a[1] < a[0])
    {
        printf("true");
    }
    else
        printf("false");
xiaolin9902 发表于 2020-3-8 00:15
先认为楼主的需求是:输入3个字符串,然后按字符串的大小进行排序,然后再依次打印字符串。

main函数内修改如下:
[C++] 纯文本查看 复制代码
int n = 3;
	int strLen = MAX_STRINGS + 1;   //定义一个变量,比字符串的最大长度大1,最后一位用于存放结束符\0
	char **a = (char**)malloc(n*sizeof(char*));  //先分配一个用于存放字符串指针的数组

	for (size_t i = 0; i < n; i++)
	{
		*(a + i) = (char*)malloc(strLen*sizeof(char));  //针对每一个字符串单独分配空间
		memset(*(a+i), 0, strLen*sizeof(char));   //初始化为0
	}

	

	printf("输入三个字符串\n");
	for (size_t i = 0; i < n; i++)
	{
		scanf_s("%s", a[i], MAX_STRINGS);  //输入字符串,用scanf_s最好加上长度,不然人家输入21位的字符串,恐怕后面的strcmp和printf都会缓冲区溢出
	}

	//冒泡法排序,不作解释
	for (size_t i = 0; i < n; i++)
	{
		for (size_t j = 0; j < n-i-1; j++)
		{
			if (strcmp(a[j],a[j + 1])>0)
			{
				char* temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}

	//打印,如果一开始分配内存时不清零,输入时不做长度限制,这里估计会挂
	for (size_t i = 0; i < n; i++)
	{
		printf("%s\n", a[i]);
	}

	free(a);

	return 0;

古月不傲 发表于 2020-3-8 00:16
ing 发表于 2020-3-8 00:03
a[0] = "qwer";
a[1] = "asdf";
a[2] = "zxcv";

你自己看看内存吧 我这里是小于
xiaolin9902 发表于 2020-3-8 00:23
本帖最后由 xiaolin9902 于 2020-3-8 00:44 编辑

额,最后释放的地方有问题,字体也难看,重新发一下。
[C++] 纯文本查看 复制代码
void main()
{
        int n = 3;
        int strLen = MAX_STRINGS + 1;   //定义一个变量,比字符串的最大长度大1,最后一位用于存放结束符\0
        char **a = (char**)malloc(n*sizeof(char*));  //先分配一个用于存放字符串指针的数组

        for (size_t i = 0; i < n; i++)
        {
                *(a + i) = (char*)malloc(strLen*sizeof(char));  //针对每一个字符串单独分配空间
                memset(*(a+i), 0, strLen*sizeof(char));   //初始化为0
        }

        

        printf("输入三个字符串\n");
        for (size_t i = 0; i < n; i++)
        {
                scanf_s("%s", a[i], MAX_STRINGS);  //输入字符串,用scanf_s最好加上长度,不然人家输入21位的字符串,恐怕后面的strcmp和printf都会缓冲区溢出
        }

        //冒泡法排序,不作解释
        for (size_t i = 0; i < n; i++)
        {
                for (size_t j = 0; j < n-i-1; j++)
                {
                        if (strcmp(a[j],a[j + 1])>0)
                        {
                                char* temp = a[j];
                                a[j] = a[j+1];
                                a[j+1] = temp;
                        }
                }
        }

        //打印,如果一开始分配内存时不清零,输入时不做长度限制,这里估计会挂
        for (size_t i = 0; i < n; i++)
        {
                printf("%s\n", a[i]);
        }

        for (size_t i = 0; i < n; i++)
        {
                free(a[i]);
        }

        free(a);

//void的函数就别return 0 了
        //return 0;
}
xiaolin9902 发表于 2020-3-8 00:43
其实我觉得完全没必要搞指针的指针,用数组没那么容易晕。例如可以这么写:
[C++] 纯文本查看 复制代码
char* a[3] = { 0 };

	for (size_t i = 0; i < n; i++)
	{
		a[i] = (char*)malloc(strLen*sizeof(char));  //针对每一个字符串单独分配空间
		memset(a[i], 0, strLen*sizeof(char));   //初始化为0
	}

//此处省略输入、排序与打印

//释放内存
for (size_t i = 0; i < n; i++)
    {
        free(a[i]);
    }

//a是指针数组,就别释放了
//free(a);

当然你如果是写一个函数,n不是常量3,而是别人传入的参数,那么就只能老老实实地采用分配内存的方式了,因为数组定义时要求长度必须是常量。初学时候,就别搞那么多层指针让自己晕了;即使以后写代码,也没必要自己给自己上难度,快速实现不出错才是香的。
UMadeleine 发表于 2020-3-9 00:01
vector或者链表?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 17:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表