我想做的是反转用户输入的数字字符串。发生的事情是它编译并运行,直到我在scanf
之后按Enter键为止。然后我收到一些Microsoft运行时错误...出了什么问题???
注意:这是家庭作业,但是我已经弄清楚了逻辑。这个错误让我感到困惑。
#include <stdio.h>
int main(){unsigned int GiveStr = 0;char * charIt;printf(“输入要反转的数字。\ t”);scanf(“%d”,&giveStr);fflush(标准输入);sprintf(charIt,“%d”,GiveStr);revStr(giveStr);的getchar();返回0;}revStr(unsigned int n){字符缓冲区[100];int uselessvar,计数器= 0;对于(; n> 0;){uselessvar = sprintf(&buffer [counter],“%d”,n);计数器++;}for(计数器= 0;计数器> 0;){printf(“%c”,buffer [counter]);计数器 - ;}返回0;}
编辑:刷新换行符stdin:/以及图像here只是不使用该程序。与我的。
对于家庭作业问题,如果您有K&R book,请转到第3.5节并仔细阅读。特别是功能reverse()
和itoa()
。这些应该给您一个很好的主意,以解决您的家庭作业问题。
您正在尝试访问未在以下位置分配的内存:
sprintf(charIt, "%d", giveStr);
将char* charIt;
更改为char charIt[50];
,并且一切都应该很好(很好,至少是分段错误部分)
也...将charIt
传递给revStr
,因为charIt
包含带有我们编号的字符串。然后,在revStr
中使用简单的for循环即可解决问题(无论如何,第二个循环的目的是什么?)
void revStr(char *giveStr)
{
int counter;
for (counter = strlen(giveStr)-1; counter >= 0; counter--)
{
printf("%c", giveStr[counter]);
}
printf("\n");
}
这将打印我们的char表示从最后一个到第一个的每个char。您应该阅读有关for
循环的更多信息。
您的程序如何退出for(; n> 0;)循环?在遇到总线错误之前,计数器是否只会增加?
ED:
[我认为,“我已经弄清楚了逻辑”的说法有些乐观。 :^)毫无疑问,有人会发布应该完成的方式在我写完这篇文章的时候,但值得指出的是出了什么问题(除了其他地方提到的内存分配问题):
您的第一个循环“ for(; n> 0;)”很奇怪,因为您要将整数n打印到计数器的缓冲区中。那么,为什么您需要多次执行此操作?如果您选择的是单个数字,则可以,但是不是,显然,您知道该怎么做,因为您已经使用了“ sprintf(charIt,“%d”,GiveStr);“。 [此外:giveStr不是一个无符号整数变量的好名字!]
您的第二个循环也有奇怪的条件:将counter设置为0,将counter> 0设置为条件,然后减少内部的counter。显然,这不会以您想要的方式遍历字符。假设您认为第一个循环是逐个字符,那么也许您正在考虑从计数器1循环到0?