2

我在为数组动态分配内存时遇到问题。我已经调试了几个小时,有什么指示吗?

我发布了其余的代码。只是应该将第一行与第二行交换,将第三行与第四行交换。我得到了奇怪的结果,例如:

输入字符串:你好

输入字符串:你好吗

输入字符串:我很好,谢谢

输入字符串:再见

输入字符串:bai

输入字符串:xx

==========================

你好吗

!我很好谢谢

你好

!你好吗

再见

!拜

我很好谢谢

!再见

!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]);
        }

    }
}   
4

1 回答 1

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 —简短、自包含、正确的示例)。

于 2013-07-03T23:25:53.683 回答