如何在C中将字符数组重置为0 / NULL?

时间:2017-09-26 04:58:08

标签: c arrays

我正在尝试编写一个程序来计算给定字符串的每个单词中的字母,并将计数附加到该单词。

示例 - I / p:蛋糕O / p:The3 cake4

在我的逻辑中,我想重置一个名为icnt的计数器变量,该变量类型为整数(已完成)&和一个名为temp的类型为字符的数组(不起作用)。 我对StackOverflow进行了一些研究并实现了memset重置,但看起来它并不适合我!

如果有错误,请更正我的计划。

#include<stdio.h>
#include<string.h>
void fun(char*,char*);

char ch[50];
char temp[10]={0};

int main()                                                      
{                                                               

        printf("Enter string :");
        scanf("%[^'\n']s",&ch); 

        fun(ch,temp);
}

void fun(char *ptr,char *tptr)
{
        int icnt = 0;

        while(*ptr!='\0')
        {
                if(*ptr!=' ')
                {
                        *tptr = *ptr;
                        tptr++;
                        icnt++;
                }
                else if(*ptr==' ')
                {
                        printf("In IF bcoz of space\n");

                        printf("%s %d\n",temp,icnt);
                        icnt = 0;
                        //temp[10] = {0};      //*
                        memset(temp,0,10);     //*
                        //Tried reseting in both the above ways *
                }

                ptr++;

        }

        if(*ptr=='\0')
        {
                printf("%s%d\n",temp,icnt);
        }


}

上述程序的输出:The34

看起来第二次没有将任何内容存储在临时变量

例外输出:The3 cake4

3 个答案:

答案 0 :(得分:2)

  

printf("%s %d\n",temp,icnt);

     

temp[10] = {0};

您的函数将temp作为参数并直接访问该全局变量。这不是一个错误,但没有任何意义:该函数仅在tptr参数具有特定值时才起作用。那么为什么要使用一个参数?

  

temp[10] = {0};

     

memset(temp,0,10);

因为你的函数用行*tptr = *ptr覆盖了那个数组的内容所以 根本不需要初始化temp数组!

相反,您只需要确保数组中的最后一个值为零。您可以通过以下方式执行此操作:

*tptr = 0;
printf(...,temp,...);

理论上你也可以使用memset,但这不是必要的,需要更多的计算时间。

  

上述程序的输出:The34

您的程序会增加tptrtptr++),但它永远不会重新设置它!

因此temp数组具有以下内容:

/* Before the first printf: */ "The\0\0\0\0\0\0\0"
/* After memset: */ "\0\0\0\0\0\0\0\0\0\0"
/* Before the second printf: */ "\0\0\0cake\0\0\0"

如果您的输入超过10个字符,您的程序甚至可能会崩溃,因为它写入内存时不允许写入。

printf将第二次写一个空字符串,因为temp数组的第一个字符是NUL ...

  

如果有错误,请更正我的计划。

我会做以下更改:

我会为tptr使用两个不同的变量:

void fun(char *ptr,char *output)
{
    char *tptr = output; /* here */

不是在函数中引用temp,而是引用我永远不会修改的参数。在printf之前,我将NUL字节写入数组的末尾,在printf之后,我将重置写指针(tptr):

*tptr = *ptr;  /* This remains tptr; does not become output */
*tptr++; /* This also */

...

*tptr = 0; /* This is new: Ensure the last byte is NUL */
printf(...,output,...); /* Not test, but output */
tptr = output; /* This is new: Reset the write pointer */
/* memset(...) - No longer needed */

答案 1 :(得分:1)

#include<stdio.h>
#include<string.h>
void fun(char*,char*);

char ch[50];
char temp[10]={0};

int main()                                                      
{                                                               

        printf("Enter string :");
        scanf("%[^'\n']s",ch); 

        fun(ch,temp);
}

void fun(char *ptr,char *tptr)
{
        int icnt = 0;

        while(*ptr!='\0')
        {
                if(*ptr!=' ')
                {
                        *tptr = *ptr;
                        tptr++;
                        icnt++;
                }
                else if(*ptr==' ')
                {
                    printf("In IF bcoz of space\n");

                    printf("%s %d\n",temp,icnt);
                    icnt = 0;
                    //temp[10] = {0};      //*
                    memset(temp,0,10);
                    tptr = temp; /* The tptr was not reinitialised to point to base address */
                    //Tried reinitialization in both the above ways *
                }

                ptr++;

        }

        if(*ptr=='\0')
        {
            printf("%s%d\n",temp,icnt); /* Here you are printing from the base address.*/
        }
}

打印是从阵列的基址完成的,重新初始化后, tptr 未设置为指向数组的基址。附带的代码应该可以正常工作。

答案 2 :(得分:0)

你必须在“inct = 0;”之后添加指令:“tptr = temp;”因为如果你不添加它,你将从表“temp”的内存空间出去。你还必须在“printf(”%s%d \ n“,temp,icnt)之前添加”* tptr ='\ 0'“;”。