我无法为数组动态分配内存。我已经调试好几个小时了,还有什么指针?
我发布了剩下的代码。它应该简单地将交换第一行与第二行交换,第三行与第四行交换。我得到了奇怪的结果,如:
输入字符串:hello
输入字符串:你好吗
输入字符串:我很感谢
输入字符串:bye
输入字符串:bai
输入字符串:xx
=========================
你好吗
!我很感谢
您好
!你好吗
再见
!白
我很感谢
!再见
bai
!XX
int count = 0;
char *lines[MAX_LINES];
char *tmp[50];
printf("Enter string: ");
fgets(tmp, 50, stdin);
lines[count] = (char *) malloc((strlen(tmp)+1) * sizeof(char));
strcpy(lines[count], tmp);
while(strcmp("xx\n", lines[count])){
count++;
printf("Enter string: ");
fgets(tmp, 50, stdin);
lines[count] = (char *) malloc((strlen(tmp)+1)* sizeof(char));
strcpy(lines[count], tmp);
}
void exchange(char * records[])
{
char * temp;
temp = records[0];
records[0] = records[1];
records[1] = temp;
temp = records[2];
records[2] = records[3];
records[3] = temp;
}
void printArray(char * inputs[], int row, int col)
{
int i, j;
for(i = 0; i < row; i++){
for(j = 0; j < col; j++){
printf("%c", inputs[i][j]);
}
}
}
答案 0 :(得分:0)
此代码似乎有效:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { MAX_LINES = 50 };
static void printArray(char *inputs[], int rows);
static int readLine(char *buffer, size_t buflen);
int main(void)
{
int count = 0;
char *lines[MAX_LINES];
char tmp[50];
for (count = 0; count < MAX_LINES; count++)
{
if (readLine(tmp, sizeof(tmp)) == EOF)
break;
lines[count] = (char *) malloc((strlen(tmp)+1)* sizeof(char));
if (lines[count] == 0)
break;
strcpy(lines[count], tmp);
}
putchar('\n');
printArray(lines, count);
return(0);
}
static int read_line(char *buffer, size_t buflen)
{
printf("Enter string: ");
if (fgets(buffer, buflen, stdin) == 0 || strcmp("xx\n", buffer) == 0)
return EOF;
return 0;
}
static void printArray(char *inputs[], int rows)
{
for (int i = 0; i < rows; i++)
printf("%d: %s", i, inputs[i]);
}
样品运行1(使用EOF):
$ ./rl
Enter string: Abyssinia
Enter string: Wimbledon Common
Enter string: ^D
0: Abyssinia
1: Wimbledon Common
$
示例运行2(使用“xx
”):
$ ./rl
Enter string: Abyssinia
Enter string: Wimbledon Common
Enter string: Strawberry Lemonade
Enter string: xx
0: Abyssinia
1: Wimbledon Common
2: Strawberry Lemonade
$
有什么不同?我修正了tmp
上的类型,如评论中所述。我创建了一个函数readLine()
来管理提示,并与"xx\n"
进程进行读取和比较,以避免重复。我避免使用strdup()
,但在使用返回的指针之前检查malloc()
是否成功。我确保读入的行数不会太多(for
循环)。 printArray()
代码仅获取行数,因为字符串的长度各不相同。我删除了exchange()
函数,因为它没有被使用,我看不出应该如何使用它。代码是完整且可编译的(因此它是SSCCE - Short, Self-Contained, Correct Example)。