关于洛谷IDE的疑问

P1957 口算练习题

@[MrDoge](/user/288305) 是gets的问题,你可以读入n也用gets,这样就不用再getchar了
by olegekei @ 2022-11-29 21:32:35


不要用 gets,不要用 gets,不要用 gets! (不知有多少OIer曾栽在gets上
by sunzz3183 @ 2022-11-29 21:48:33


@[olegekei](/user/593613) 我用下面的代码输入了n,在洛谷ide上试着输出了一下也能转换成int型,但整个程序直接没有输出了,一个也算不了了。。。(本地还是没问题) ```cpp gets(n); int n1, n2 = 0; for(n1 = 0; n[n1] !='\0'; n1++); for(int k = n1-1; k >= 0; k--){ n2 += (n[cnt]-'0')*pow(10,k); cnt++; } ``` 完整的代码是下面的(好冗长觉得自己好菜。。)感谢大佬帮助 ```cpp #include<cstdio> #include<cmath> #include<string.h> using namespace std; char all[100], ca[10], cb[10]; int x1[100], x2[100], x3[100], x4[100]; char s1[100]; char n[10]; int main(){ int i = 0, cnt = 0, na = 0, nb = 0, numa = 0, numb = 0, out; gets(n); int n1, n2 = 0; for(n1 = 0; n[n1] !='\0'; n1++); for(int k = n1-1; k >= 0; k--){ n2 += (n[cnt]-'0')*pow(10,k); cnt++; } char f; for(int k = 1; k <= n2; k++){ memset(all, '\0', sizeof(all)); memset(ca, '\0', sizeof(ca)); memset(cb, '\0', sizeof(cb)); gets(all); if(all[0] == 'a' || all[0] == 'b' || all[0] == 'c'){ switch(all[0]){ case 'a': f = '+'; cnt = 0, numa = 0, numb = 0; for(i = 2; all[i] != ' '; i++){ ca[cnt] = all[i]; cnt++; } cnt = 0; for(i++; all[i] != '\0'; i++){ cb[cnt] = all[i]; cnt++; } for(na = 0; ca[na] != '\0'; na++); na--; for(nb = 0; cb[nb] != '\0'; nb++); nb--; cnt = na; for(int j = 0; j <= na; j++){ numa += (ca[j]-'0')*pow(10, cnt); cnt--; } cnt = nb; for(int j = 0; j <= nb; j++){ numb += (cb[j]-'0')*pow(10, cnt); cnt--; } s1[k] = f; x1[k] = numa; x2[k] = numb; x3[k] = numa+numb; out = numa+numb; cnt = na+nb+2+2; while(out){ cnt++; out /= 10; } x4[k] = cnt; break; case 'b': f = '-'; cnt = 0, numa = 0, numb = 0; for(i = 2; all[i] != ' '; i++){ ca[cnt] = all[i]; cnt++; } cnt = 0; for(i++; all[i] != '\0'; i++){ cb[cnt] = all[i]; cnt++; } for(na = 0; ca[na] != '\0'; na++); na--; for(nb = 0; cb[nb] != '\0'; nb++); nb--; cnt = na; for(int j = 0; j <= na; j++){ numa += (ca[j]-'0')*pow(10, cnt); cnt--; } cnt = nb; for(int j = 0; j <= nb; j++){ numb += (cb[j]-'0')*pow(10, cnt); cnt--; } s1[k] = f; x1[k] = numa; x2[k] = numb; x3[k] = numa-numb; out = numa-numb; if(numa-numb>=0){ cnt = na+nb+2+2; while(out){ cnt++; out /= 10; } x4[k] = cnt; } else{ cnt = na+nb+2+3; out = -out; while(out){ cnt++; out /= 10; } x4[k] = cnt; } break; case 'c': f = '*'; cnt = 0, numa = 0, numb = 0; for(i = 2; all[i] != ' '; i++){ ca[cnt] = all[i]; cnt++; } cnt = 0; for(i++; all[i] != '\0'; i++){ cb[cnt] = all[i]; cnt++; } for(na = 0; ca[na] != '\0'; na++); na--; for(nb = 0; cb[nb] != '\0'; nb++); nb--; cnt = na; for(int j = 0; j <= na; j++){ numa += (ca[j]-'0')*pow(10, cnt); cnt--; } cnt = nb; for(int j = 0; j <= nb; j++){ numb += (cb[j]-'0')*pow(10, cnt); cnt--; } s1[k] = f; x1[k] = numa; x2[k] = numb; x3[k] = numa*numb; out = numa*numb; cnt = na+nb+2+2; while(out){ cnt++; out /= 10; } x4[k] = cnt; break; } } else{ switch(f){ case '+': cnt = 0, numa = 0, numb = 0; for(i = 0; all[i] != ' '; i++){ ca[cnt] = all[i]; cnt++; } cnt = 0; for(i++; all[i] != '\0'; i++){ cb[cnt] = all[i]; cnt++; } for(na = 0; ca[na] != '\0'; na++); na--; for(nb = 0; cb[nb] != '\0'; nb++); nb--; cnt = na; for(int j = 0; j <= na; j++){ numa += (ca[j]-'0')*pow(10, cnt); cnt--; } cnt = nb; for(int j = 0; j <= nb; j++){ numb += (cb[j]-'0')*pow(10, cnt); cnt--; } out = numa+numb; s1[k] = f; x1[k] = numa; x2[k] = numb; x3[k] = numa+numb; cnt = na+nb+2+2; while(out){ cnt++; out /= 10; } x4[k] = cnt; break; case '-': cnt = 0, numa = 0, numb = 0; for(i = 0; all[i] != ' '; i++){ ca[cnt] = all[i]; cnt++; } cnt = 0; for(i++; all[i] != '\0'; i++){ cb[cnt] = all[i]; cnt++; } for(na = 0; ca[na] != '\0'; na++); na--; for(nb = 0; cb[nb] != '\0'; nb++); nb--; cnt = na; for(int j = 0; j <= na; j++){ numa += (ca[j]-'0')*pow(10, cnt); cnt--; } cnt = nb; for(int j = 0; j <= nb; j++){ numb += (cb[j]-'0')*pow(10, cnt); cnt--; } out = numa-numb; s1[k] = f; x1[k] = numa; x2[k] = numb; x3[k] = numa-numb; if(numa-numb>=0){ cnt = na+nb+2+2; while(out){ cnt++; out /= 10; } x4[k] = cnt; } else{ cnt = na+nb+2+3; out = -out; while(out){ cnt++; out /= 10; } x4[k] = cnt; } break; case '*': cnt = 0, numa = 0, numb = 0; for(i = 0; all[i] != ' '; i++){ ca[cnt] = all[i]; cnt++; } cnt = 0; for(i++; all[i] != '\0'; i++){ cb[cnt] = all[i]; cnt++; } for(na = 0; ca[na] != '\0'; na++); na--; for(nb = 0; cb[nb] != '\0'; nb++); nb--; cnt = na; for(int j = 0; j <= na; j++){ numa += (ca[j]-'0')*pow(10, cnt); cnt--; } cnt = nb; for(int j = 0; j <= nb; j++){ numb += (cb[j]-'0')*pow(10, cnt); cnt--; } out = numa*numb; s1[k] = f; x1[k] = numa; x2[k] = numb; x3[k] = numa*numb; cnt = na+nb+2+2; while(out){ cnt++; out /= 10; } x4[k] = cnt; break; } } } for(int k = 1; k <= n2; k++){ printf("%d%c%d=%d\n%d\n", x1[k], s1[k], x2[k], x3[k], x4[k]); } } ```
by MrDoge @ 2022-11-29 22:06:50


@[sunzz3183](/user/171868) 因为scanf输入字符串不能带空格,只学了gets就一直用了。。出现了两三次这种情况。。大佬能给几个能输入带空格字符串的函数名吗,我自己查一下学一下。。感谢大佬
by MrDoge @ 2022-11-29 22:09:06


@[MrDoge](/user/288305) getline可以考虑,但是有时会出锅
by InnitTimmer @ 2022-11-29 22:14:02


@[InnitTimmer](/user/778834) 好的,感谢
by MrDoge @ 2022-11-29 22:20:00


@[MrDoge](/user/288305) getline比较稳定了,用这个基本不出锅
by sunzz3183 @ 2022-11-30 06:51:31


@[sunzz3183](/user/171868) okk
by MrDoge @ 2022-11-30 09:13:16


@[MrDoge](/user/288305) 这个自动忽略换行 cin.get可以读入换行 getchar的数量由评测环境定,有时win转linux或linux转win就要用两个getchar
by sunzz3183 @ 2022-11-30 10:47:26


@[sunzz3183](/user/171868) 明白了,感谢
by MrDoge @ 2022-11-30 13:59:53


|