1

所以程序应该执行以下操作:
要求用户输入字符串(字符串的最大长度为 250),一旦用户不输入任何内容(所以基本上按“回车”),程序停止输入并继续显示用户向后输入的每个字符串。
这是我的代码 - 一切正常,除了我无法进入while底部的循环。

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

int main()
{
    char userInput[250];
    char *newSpace;
    char *array;
    int stringLength;
    int inputElems = 0;
    //Reset startingPtr back to where 'array' begins
    char *startingPtr = array - inputElems;
    // Sets endPtr to the last input element in the array
    char *endPtr = startingPtr + inputElems;

    do
    {
        puts("Please enter a string!");
        // Gets input from user
        fgets(userInput, 250, stdin);
        // Finds out the number of characters the user entered
        // + 1 to make room for the null character
        stringLength = strlen(userInput) + 1;
        // Allocate memory with the needed space
        newSpace = malloc(stringLength);
        // If malloc didn't allocate memory, display error
        if (NULL == newSpace)
        {
            puts("Error!");
        }

        // Copy user input into array
        strcpy(newSpace, userInput);
        // Save input into array
        array = newSpace;

        // For testing purposes only, this line will be deleted once I can access the array
        //puts("Here's what you wrote");
        //printf("%s", array);

        // Increase array
        array++;
        // Increase number of times user has input something
        inputElems++;

    } while(stringLength != 2);

    //puts("Testing outside");

    while (endPtr > startingPtr)
    {
        //puts("Testing inside");
        --endPtr;
        printf("%s", *endPtr);
    }

    free(newSpace);
}
4

2 回答 2

1

你的while循环体永远不会被执行,因为你永远不会修改endPtr并且startingPtr在整个程序的生命周期中,它们都指向同一个位置。因此,endPtr > startingPtr永远不会是真的。

此外,array++不会按您期望的方式工作:array指向用户所写内容的第一个字符,然后array++将其向前移动到下一个字符。我想你想要一个数组char *。因此,更改char *array;char *array[250];(假设用户最多可以输入 250 个句子)。

当然,由于您不能递增数组,因为数组不是可修改的左值,因此您还必须保留最后写入的索引的计数。但我看到你已经有了inputElems,这应该足够了。这是修改后的代码:

int main()
{
    char userInput[250];
    char *newSpace;
    char *array[250];
    int stringLength;
    int i;
    int inputElems = 0;

    do
    {
        puts("Please enter a string!");
        // Gets input from user
        fgets(userInput, 250, stdin);
        // Finds out the number of characters the user entered
        // + 1 to make room for the null character
        stringLength = strlen(userInput) + 1;
        // Allocate memory with the needed space
        newSpace = malloc(stringLength);
        // If malloc didn't allocate memory, display error
        if (NULL == newSpace)
        {
            puts("Error!");
        }

        // Copy user input into array
        strcpy(newSpace, userInput);
        // Save input into array
        array[inputElems] = newSpace;

        // For testing purposes only, this line will be deleted once I can access the array
        //puts("Here's what you wrote");
        //printf("%s", array);

        // Increase number of times user has input something
        inputElems++;

    } while(stringLength != 2);

    //puts("Testing outside");

    for (i = inputElems-1; i >= 0; i++)
    {
        //puts("Testing inside");
        printf("%s", array[i]);
        free(array[i]);         
    }
    return 0;
}

请注意代码末尾的更新循环。它从头到尾遍历数组。请注意,我改变了你打电话的地方free()。由于我们在循环内分配内存,因此对于 中的每个位置array,我们也必须在free()每个位置上,因此这也必须在循环内进行。

于 2013-10-16T21:08:46.927 回答
0

好的。您需要一个指针数组,例如: char *arr[10];

您可以在此处存储从 arr[0] 到 arr[9] 的 10 个字符串。(嗯,不是直接 10 个字符串,而是指向它们的指针)

arr[0] = (char*)malloc(sizeof(char * length_of_string));

strncpy(arr[0], your_string, length_of_string);

当只是将 arr[9] 打印到 arr[0] 时。

制造

于 2013-10-16T21:06:08.140 回答