求助

qq_38080117 2017-09-19 08:21:02
#include <stdio.h>
#define maxn 10000000+10
int main()
{
char s[maxn];
scanf("%s", s);
int tot = 0;
for (int i = 0; i < strlen(s);i++)

if (s[i] == 1) tot++;

printf("%d\n",tot);
return 0;
}
书上说至少有三个错误。程序无法运行是啥原因,结果不对也没找到原因,还有效率低下也不知道啥原因,好崩溃啊!各位大侠帮帮忙,我知道对你们来说太LOW,但是我实在是找不到原因了!在此谢过了!
...全文
391 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_38080117 2017-09-23
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
#include <stdio.h>
#include <string.h>
#define maxn (10000000+10)
int main() {
    static char s[maxn];
    fgets(s,maxn,stdin);
    int tot = 0;
    char *p=(char *)s;
    while (1) {
        if (*p == '1')  tot++;
        if (*p==0) break;
        p++;
    }
    printf("%d\n",tot);
	return	0;
}
加括号与不加有啥区别
qq_38080117 2017-09-23
  • 打赏
  • 举报
回复
引用 8 楼 paschen 的回复:
引用 5 楼 qq_38080117 的回复:
[quote=引用 1 楼 paschen 的回复:]数组char s[maxn];太大了,应该在堆上申请空间其次,s[i] == 1 是否想表达的是:s[i] == '1'
目的是统计1的个数,所以我也不知道是1还是‘1’。应该是哪个?
应该是后者,表示的是字符的1[/quote]谢谢
赵4老师 2017-09-23
  • 打赏
  • 举报
回复
这个程序中没区别。加十是我照抄的。
qq_38080117 2017-09-23
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
static int s[maxn*sizeof(int)];//将来如果有这么一句,加不加括号区别就大了!
在这个程序里有啥区别吗?为啥要加10呢?
赵4老师 2017-09-23
  • 打赏
  • 举报
回复
static int s[maxn*sizeof(int)];//将来如果有这么一句,加不加括号区别就大了!
qq_38080117 2017-09-22
  • 打赏
  • 举报
回复
引用 9 楼 cfjtaishan 的回复:
[quote=引用 6 楼 qq_38080117 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:]
#include <stdio.h>
#include <string.h>

#define maxn   10000000+10

char s[maxn];

int main()
{
    int tot = 0;
    int i;

    scanf("%s", s);
    for (i = 0; i < strlen(s);i++)
        if (s[i] == '1')
            tot++;

    printf("%d\n",tot);
    return  0;
}
效率低是由于申请的栈上的空间太大,栈上的空间是有限的,你申请的栈上空间接近10M,代码是在栈上运行的,如果栈上空间不足就会从磁盘上开辟,并做数据交换,自然运行效率就低了。 建议你在数据段或者堆上申请这部分空间。如果不需要那么多空间,可以定义适量,也可以通过malloc和realloc逐步增加空间。 另外,字符'1'和数值1是不一样的它们的数值相差48
那0和‘0’也不一样吗?它们也是相差48吗?效率的问题理解了,但是那么大的栈区空间会使程序崩溃吗?[/quote] 对呀,'0'的ascii值是48,数值0就是0,48 - 0 = 48;[/quote]谢谢,懂了
自信男孩 2017-09-21
  • 打赏
  • 举报
回复
引用 6 楼 qq_38080117 的回复:
[quote=引用 2 楼 cfjtaishan 的回复:]
#include <stdio.h>
#include <string.h>

#define maxn   10000000+10

char s[maxn];

int main()
{
    int tot = 0;
    int i;

    scanf("%s", s);
    for (i = 0; i < strlen(s);i++)
        if (s[i] == '1')
            tot++;

    printf("%d\n",tot);
    return  0;
}
效率低是由于申请的栈上的空间太大,栈上的空间是有限的,你申请的栈上空间接近10M,代码是在栈上运行的,如果栈上空间不足就会从磁盘上开辟,并做数据交换,自然运行效率就低了。 建议你在数据段或者堆上申请这部分空间。如果不需要那么多空间,可以定义适量,也可以通过malloc和realloc逐步增加空间。 另外,字符'1'和数值1是不一样的它们的数值相差48
那0和‘0’也不一样吗?它们也是相差48吗?效率的问题理解了,但是那么大的栈区空间会使程序崩溃吗?[/quote] 对呀,'0'的ascii值是48,数值0就是0,48 - 0 = 48;
赵4老师 2017-09-20
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#define maxn (10000000+10)
int main() {
    static char s[maxn];
    fgets(s,maxn,stdin);
    int tot = 0;
    char *p=(char *)s;
    while (1) {
        if (*p == '1')  tot++;
        if (*p==0) break;
        p++;
    }
    printf("%d\n",tot);
	return	0;
}
paschen 2017-09-20
  • 打赏
  • 举报
回复
引用 5 楼 qq_38080117 的回复:
引用 1 楼 paschen 的回复:
数组char s[maxn];太大了,应该在堆上申请空间其次,s[i] == 1 是否想表达的是:s[i] == '1'
目的是统计1的个数,所以我也不知道是1还是‘1’。应该是哪个?
应该是后者,表示的是字符的1
qq_38080117 2017-09-20
  • 打赏
  • 举报
回复
引用 3 楼 shanshenyuyou 的回复:
问题1:在栈内存上申请一个的数组,会导致溢出,如楼上所言在堆上申请内存好一些 2.用scanf输入字符串时,其空格仍被当做字符输了进去 3.如一楼所示 其他,宏定义最后的常数一般加括号处理,for循环中的int i=0在一些编译器不能被支持
弱弱的问句,加括号是啥意思,有何区别?不加会出错吗?
qq_38080117 2017-09-20
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
#include <stdio.h>
#include <string.h>

#define maxn   10000000+10

char s[maxn];

int main()
{
    int tot = 0;
    int i;

    scanf("%s", s);
    for (i = 0; i < strlen(s);i++)
        if (s[i] == '1')
            tot++;

    printf("%d\n",tot);
    return  0;
}
效率低是由于申请的栈上的空间太大,栈上的空间是有限的,你申请的栈上空间接近10M,代码是在栈上运行的,如果栈上空间不足就会从磁盘上开辟,并做数据交换,自然运行效率就低了。 建议你在数据段或者堆上申请这部分空间。如果不需要那么多空间,可以定义适量,也可以通过malloc和realloc逐步增加空间。 另外,字符'1'和数值1是不一样的它们的数值相差48
那0和‘0’也不一样吗?它们也是相差48吗?效率的问题理解了,但是那么大的栈区空间会使程序崩溃吗?
shanshenyuyou 2017-09-20
  • 打赏
  • 举报
回复
问题1:在栈内存上申请一个的数组,会导致溢出,如楼上所言在堆上申请内存好一些 2.用scanf输入字符串时,其空格仍被当做字符输了进去 3.如一楼所示 其他,宏定义最后的常数一般加括号处理,for循环中的int i=0在一些编译器不能被支持
qq_38080117 2017-09-20
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
数组char s[maxn];太大了,应该在堆上申请空间 其次,s[i] == 1 是否想表达的是:s[i] == '1'
目的是统计1的个数,所以我也不知道是1还是‘1’。应该是哪个?
自信男孩 2017-09-20
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

#define maxn   10000000+10

char s[maxn];

int main()
{
    int tot = 0;
    int i;

    scanf("%s", s);
    for (i = 0; i < strlen(s);i++)
        if (s[i] == '1')
            tot++;

    printf("%d\n",tot);
    return  0;
}
效率低是由于申请的栈上的空间太大,栈上的空间是有限的,你申请的栈上空间接近10M,代码是在栈上运行的,如果栈上空间不足就会从磁盘上开辟,并做数据交换,自然运行效率就低了。 建议你在数据段或者堆上申请这部分空间。如果不需要那么多空间,可以定义适量,也可以通过malloc和realloc逐步增加空间。 另外,字符'1'和数值1是不一样的它们的数值相差48
paschen 2017-09-19
  • 打赏
  • 举报
回复
数组char s[maxn];太大了,应该在堆上申请空间 其次,s[i] == 1 是否想表达的是:s[i] == '1'

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧