【问题标题】:Using pointers for string manipulation in c在c中使用指针进行字符串操作
【发布时间】:2013-06-20 00:56:56
【问题描述】:

这里我正在检查一个句子是否是回文。我在学习堆栈的过程中这样做。

有没有办法我可以使用指针而不是 char 数组“发送”,以便在以下代码中输入字符的数量不必限制为 20? 代码运行良好,但在性能或其他方面是否应该有任何改进? 在使用堆栈时我应该记住的指针有什么重要的吗,比如将其初始化为 NULL? 谢谢

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

typedef struct node
{
    char data;
    struct node *link;
}StackNode;

void insertData(StackNode **);
void push(StackNode **, char);
void checkData(StackNode **);
bool pop(StackNode **,char *);

char sent[20] = "";

void main()
{
   StackNode *stackTop;
   stackTop = NULL;
   insertData(&stackTop);
   checkData(&stackTop);
   printf("\n");
   return;
}

void insertData(StackNode **stackTop)
{
    char c;
    int len;

    printf("Enter the Sentence\n");
    while( ( ( c = getchar() ) != '\n'))
    {   
        if( ( ( c>='a' &&c<='z') || (c>='A' && c<='Z')))
        {
            if((c>='A' && c<='Z'))
            {
                int rem;
                rem = c-'A';
                c='a' + rem;
            }
            push(stackTop,c);
            len = strlen(sent);
            sent[len++]=c;
            sent[len]='\0';
        }
    }
    printf("Letters are %s\n\n",sent);
}

void push(StackNode **stackTop,char c)
{
    StackNode *pNew;
    pNew = (StackNode*) malloc(sizeof(StackNode));
    if(!pNew)
    {
        printf("Error 100:Out of memory\n");
        exit(100);
    }
    pNew->data = c;
    pNew->link = *stackTop;
    *stackTop = pNew;
}

void checkData(StackNode **stackTop)
{
    char c;
    int i=0;
    while(pop(stackTop,&c))
    {
        if( c !=sent[i++])
        {
            printf("Not palindrome");
            return;
        }
    }
    printf("Palindrome");
}

bool pop(StackNode **stackTop,char *c)
{
    StackNode *pNew;
    pNew = *stackTop;
    if(pNew == NULL)
        return false;
    *c = pNew->data;
    *stackTop = pNew->link;
    printf("char poped %c\n",*c);
    free(pNew);
    return true;
}

【问题讨论】:

  • 代码中的任何地方都没有 char 数组,我也没有看到 20 个字符的任何限制。这个问题似乎与代码无关。
  • 您的问题似乎与您的代码不一致,但您始终可以使用指针而不是数组。
  • 对不起,请立即查看
  • 属于Code Review。

标签: c pointers data-structures stack arrays


【解决方案1】:

据我所知,没有办法拥有“无限数组”或没有限制的数组。但是,如果您使用malloc,您可以生成足够大的内存部分,您无需担心这些限制。我稍后会在您使用 malloc 的代码中看到这一点,所以我假设您知道它是如何工作的。但是,我会使用这样的东西;

char * sent = malloc(sizeof(char) * 100);
if(sent == NULL){
     printf("OUT OF MEMORY!");
     return 1;
}

其中 100 是您希望拥有的缓冲区大小。我使用了最大 10000 的大小,并且在运行时没有问题,所以这可能是您需要的。

【讨论】:

    【解决方案2】:

    在 C 中,数组实际上是指向静态分配内存的指针。创建指向数组或数组中任何元素的指针非常简单。例如,假设我们有数组char sent[20]. 如果我们想创建一个指向与发送的完全相同的内存的指针,我们可以声明char *sentP = sent。我们现在可以用sentP 替换sent 的任何使用。我们甚至可以创建一个指向已发送中间的指针:char *sentMidP = sent + 9。现在,sentMidP[0] 与 sent[9] 相同,sentMidP[-9] 与 sent[0]. 相同

    但是,与sent 不同,我们可以更改sentP 和sentMidP 指向的位置(将sent 视为常量指针char * const,您无法更改)。因此,如果您有另一个数组 char sent2[100]'. You can set the value ofsentPtosent2. What's cool about this is that you can do it *at runtime*, which effectively means that you can change the size ofsentP`,具体取决于您输入的大小。

    但是,没有必要将自己局限于静态分配的输入。 C 提供了malloc 函数(参见here)在运行时分配内存。因此,如果您在编译时不知道句子的大小,但您会在运行时知道它(比如在一个名为 sentenceLength 的变量中),您可以像下面这样分配 `sentP'。

    char *sentP = malloc(sizeof(char) * (sentenceLength + 1)); // Plus one for the NUL termination byte in C strings
    if (sentP == NULL) {
         fprintf(stderr, "No more memory :(");
         exit(EXIT_FAILURE);
     }
    

    请注意我们现在必须如何处理内存不足错误。一般来说,动态分配会引入更多开销,因为我们可能会耗尽内存,要求我们确保只访问分配的内容,并且需要在完成后使用free 释放内存。

    当你用完 sentP 指针后,一定要释放它:

    free(sentP);
    

    就是这样!您可以使用我们在您的代码中创建的sentP 指针,一切都应该很好。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多