我正在尝试编写一个程序来计算给定字符串的每个单词中的字母,并将计数附加到该单词。
示例 - 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
答案 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
您的程序会增加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 ...
如果有错误,请更正我的计划。
我会做以下更改:
我会为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'“;”。