#include<stdio.h>
#include<string.h>
int main(){
int num;
char s[1000000];
while(scanf("%d", &num) != EOF){
int p = 0, count = 0;
for(int i = 0; i < num; i++){
gets(s);
for(int j = 0; j < strlen(s); j++){
if(s[j] == '.'){
continue;
}
else if(s[j] == 'p'){
p++;
}
else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p
p--;
count++;
}
}
}
printf("%d\n", count);
}
}
#include
#include
int main(){
int num;
char s[1000000];
while(scanf("%d", &num) != EOF){
int p = 0, count = 0;
for(int i = 0; i < num; i++){
gets(s);
for(int j = 0; j < strlen(s); j++){
if(s[j] == '.'){
continue;
}
else if(s[j] == 'p'){
p++;
}
else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p
p--;
count++;
}
}
}
printf("%d\n", count);
}
}
1. 每一行是一組名單,每一組要輸出一個數字
2. scanf("%d", &num) 這個數字後面的換行符號會留在buffer裡,所以下面第一個gets()得到的只有換行符號
3. 長度最大有10⁷,你的陣列不夠大
#include
#include
int main(){
int num;
char s[1000000];
while(scanf("%d", &num) != EOF){
int p = 0, count = 0;
for(int i = 0; i < num; i++){
gets(s);
for(int j = 0; j < strlen(s); j++){
if(s[j] == '.'){
continue;
}
else if(s[j] == 'p'){
p++;
}
else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p
p--;
count++;
}
}
}
printf("%d\n", count);
}
}
1. 每一行是一組名單,每一組要輸出一個數字2. scanf("%d", &num) 這個數字後面的換行符號會留在buffer裡,所以下面第一個gets()得到的只有換行符號
3. 長度最大有10⁷,你的陣列不夠大
我改寫成這樣:
#include<stdio.h>
#include<string.h>
int main(){
int num;
char s[10000000] = {0};
scanf("%d\n", &num);
for(int i = 0; i < num; i++){
gets(s);
int p = 0, count = 0;
for(int j = 0; j < strlen(s); j++){
if(s[j] == '.'){
continue;
}
else if(s[j] == 'p'){
p++;
}
else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p
p--;
count++;
}
}
printf("%d\n", count);
}
}
但是只要陣列大小開成10⁷,一執行程式就會爆掉,怎麼辦?
#include
#include
int main(){
int num;
char s[1000000];
while(scanf("%d", &num) != EOF){
int p = 0, count = 0;
for(int i = 0; i < num; i++){
gets(s);
for(int j = 0; j < strlen(s); j++){
if(s[j] == '.'){
continue;
}
else if(s[j] == 'p'){
p++;
}
else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p
p--;
count++;
}
}
}
printf("%d\n", count);
}
}
1. 每一行是一組名單,每一組要輸出一個數字2. scanf("%d", &num) 這個數字後面的換行符號會留在buffer裡,所以下面第一個gets()得到的只有換行符號
3. 長度最大有10⁷,你的陣列不夠大
我改寫成這樣:
#include
#include
int main(){
int num;
char s[10000000] = {0};
scanf("%d\n", &num);
for(int i = 0; i < num; i++){
gets(s);
int p = 0, count = 0;
for(int j = 0; j < strlen(s); j++){
if(s[j] == '.'){
continue;
}
else if(s[j] == 'p'){
p++;
}
else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p
p--;
count++;
}
}
printf("%d\n", count);
}
}
但是只要陣列大小開成10⁷,一執行程式就會爆掉,怎麼辦?
這題不需要用陣列,用字元就可以了,在迴圈內用getchar()每次讀取一個字元就不會爆掉了
#include
#include
int main(){
int num;
char s[1000000];
while(scanf("%d", &num) != EOF){
int p = 0, count = 0;
for(int i = 0; i < num; i++){
gets(s);
for(int j = 0; j < strlen(s); j++){
if(s[j] == '.'){
continue;
}
else if(s[j] == 'p'){
p++;
}
else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p
p--;
count++;
}
}
}
printf("%d\n", count);
}
}
1. 每一行是一組名單,每一組要輸出一個數字2. scanf("%d", &num) 這個數字後面的換行符號會留在buffer裡,所以下面第一個gets()得到的只有換行符號
3. 長度最大有10⁷,你的陣列不夠大
我改寫成這樣:
#include
#include
int main(){
int num;
char s[10000000] = {0};
scanf("%d\n", &num);
for(int i = 0; i < num; i++){
gets(s);
int p = 0, count = 0;
for(int j = 0; j < strlen(s); j++){
if(s[j] == '.'){
continue;
}
else if(s[j] == 'p'){
p++;
}
else if(s[j] == 'q' && p > 0){//讀取的字元為q,且之前有讀到字元p
p--;
count++;
}
}
printf("%d\n", count);
}
}
但是只要陣列大小開成10⁷,一執行程式就會爆掉,怎麼辦?
這題不需要用陣列,用字元就可以了,在迴圈內用getchar()每次讀取一個字元就不會爆掉了
謝謝你幫我解答,我後來上網查了一下,把陣列改成"動態記憶體配置"就不會爆掉了。