gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:03:52 28 4
gpt4 key购买 nike

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

示例 - 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

最佳答案

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,但这不是必需的,并且会花费更多的计算时间。

Output of the above program: The34

您的程序会递增tptr (tptr++),但它永远不会重新设置它!

因此 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...

Kindly correct my program if there are mistakes.

我会做以下更改:

我会为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 */

关于c - 如何在 C 中将字符数组重置为 0/NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46418096/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com