[英]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
的有效索引是0
到count-1
,假设您只想读取有效字符串。 但是,您正在使用索引1
来count
。 因此,您应该移动该行
count = count - 1;
在那条线之前。
另外,线
printf(rev);
没有意义。
如果要打印数组中的所有字符串,则应在循环中单独打印每个字符串。
由于您将有效字符串的数量存储在变量temp
中,因此您必须打印那么多字符串。
for ( int i = 0; i < temp; i++ )
{
printf( "%s\n", rev[i] );
}
此外,您应该#include <string.h>
,因为您使用的是strcpy
和strlen
。
此外,您可能应该从从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.