繁体   English   中英

解决 C 中两个 arrays 之间的 memory 损失

[英]resolving memory loss between two arrays in C

晚上好。 我正在为 class 开发一个程序,在使用 C 处理 arrays 时,我遇到了障碍。

--EDIT-- 完整代码已发布。


#define _CRT_SECURE_NO_WARNINGS
#define STRMAX 20
#define MAX 100
#include<stdio.h>
int main()
{
    int count = 0;
    char strlist[STRMAX][MAX];
    int start = 0, end = STRMAX;
    for (start; start < end; start++) {
        char string[MAX];
        printf("Enter a string: ");
        fgets(string, MAX - 1, stdin);
        printf("\nThe string is: %s", string);
        int size = strlen(string);
        int result = strcmp(string, "stop\n");
        if (result == 0) {
            break;

        }

        strcpy(strlist[start], string);
        count = count + 1;
    }
    char rev[STRMAX][MAX];
    int temp = 0;
    printf("count is: %d\n",count);
    while (count != 0) {
        strcpy(rev[temp], strlist[count]);
        temp = temp + 1;
        count = count - 1;
    }
    printf(rev);

   
    return 0;
}

最后一行, printf(rev); 正在抛出警告: “使用未初始化的 memory 'rev'。”

我不明白 C,这是本课程的开始。 但是,我不是在寻找“为我做功课”的答案,更多的是“这是 go 关于这个问题的更好方法”的答案。

代码的 output 是:

Enter a string: 1

The string is: 1
Enter a string: 2

The string is: 2
Enter a string: 3

The string is: 3
Enter a string: stop

The string is: stop
count is: 3
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠3

“计数为:3”完全用于调试。 我真的不知道为什么我的解决方案不起作用。 如果需要更多信息或您想查看的任何其他信息,请随时询问,我会更新帖子。 谢谢。

--EDIT-- STRMAX 和 MAX 都是为保持字符串数组(分别为 20 和 50)所需的 2D 数组设置的定义

首先,线

strcpy(rev[temp], strlist[count]);

是错的。 strlist的有效索引是0count-1 ,假设您只想读取有效字符串。 但是,您正在使用索引1count 因此,您应该移动该行

count = count - 1;

在那条线之前。

另外,线

printf(rev);

没有意义。

如果要打印数组中的所有字符串,则应在循环中单独打印每个字符串。

由于您将有效字符串的数量存储在变量temp中,因此您必须打印那么多字符串。

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

此外,您应该#include <string.h> ,因为您使用的是strcpystrlen

此外,您可能应该从从fgets获得的输入中删除尾随换行符 否则,您将打印该换行符,这会给您带来不需要的额外行,迫使您通过显式打印更少的换行符来进行补偿。 换行符的存在也迫使您将换行符添加到目标字符串"stop"

int result = strcmp(string, "stop\n");

如果您还从输入字符串中删除它,您将能够从目标字符串中删除该换行符。

进行这些更改后,您的代码应如下所示:

#define _CRT_SECURE_NO_WARNINGS
#define STRMAX 20
#define MAX 100
#include <stdio.h>
#include <string.h>
int main()
{
    int count = 0;
    char strlist[STRMAX][MAX];
    int start = 0, end = STRMAX;
    for (; start < end; start++) {
        char string[MAX];
        printf("Enter a string: ");
        fgets(string, MAX - 1, stdin);

        //remove trailing newline character
        string[strcspn(string,"\n")] = '\0';

        printf("The string is: %s\n", string);
        int result = strcmp(string, "stop");
        if (result == 0) {
            break;
        }

        strcpy(strlist[start], string);
        count = count + 1;
    }
    char rev[STRMAX][MAX];
    int temp = 0;
    printf("count is: %d\n",count);
    while (count != 0) {
        count = count - 1;
        strcpy(rev[temp], strlist[count]);
        temp = temp + 1;
    }

    for ( int i = 0; i < temp; i++ )
    {
        printf( "%s\n", rev[i] );
    }
    
    return 0;
}

这个程序有以下output:

Enter a string: 1
The string is: 1
Enter a string: 2
The string is: 2
Enter a string: 3
The string is: 3
Enter a string: stop
The string is: stop
count is: 3
3
2
1

您误解了 printf() 的语法。 printf("placeholder", variable) 这是正确的方法。 “占位符”取决于当然的变量类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM