在更熟悉java之后,我第一次學習C,對于這個程式,它需要兩行輸入來輸入一副牌,它會說一排有多少張牌是相同的花色,有多少張是按升序排列的。
我的問題是我認為我的兩個函式都在作業并且它們似乎獨立作業但是當我嘗試運行它們然后輸出兩個答案時,它要么什么都不顯示,要么不顯示 5 而不是 1118234。
我也不確定為什么當我在 main 中注釋掉 for 回圈時會出現分段錯誤,但是使用 for 回圈它可以作業......除了它沒有正確使用計數器?我不知道從哪里開始,如果有任何幫助,我將不勝感激!
#include <stdio.h>
#include <string.h>
#include <ctype.h>
const int DECKSIZE = 52;
int sameSuitCount(char firstHalf[DECKSIZE], char secondHalf[DECKSIZE]);
int ascendingCount(char firstHalf[DECKSIZE], char secondHalf[DECKSIZE]);
int main() {
int numTests = 0, sameSuit = 0, ascending = 0;
scanf("%d", &numTests);
for (int i = 0; i < numTests; i ) {
char first[DECKSIZE 1];
scanf("%s", first);
char second[DECKSIZE 1];
scanf("%s", second);
sameSuit = sameSuitCount(first, second);
ascending = ascendingCount(first, second);
printf("\n%d\n", sameSuit);
printf("\n%d", ascending);
}
return 0;
}
int sameSuitCount(char firstHalf[DECKSIZE], char secondHalf[DECKSIZE]) {
int count = 1, max = 0;
strcat(firstHalf, secondHalf);
for (int i = 3; i < (DECKSIZE*2); i = 2){
//printf("\n%c", firstHalf[i]);
if(firstHalf[i] == firstHalf[i-2]) {
//printf(" is the same as %c", firstHalf[i-2]);
count ;
//printf(". Count = %d", count);
}
else {
if (count > max){
//printf("\nSetting max to %d", count);
max = count;
//printf(". Max = %d", max);
}
count = 1;
//printf("Count reset to %d", count);
}
}
return max;
}
int ascendingCount(char firstHalf[DECKSIZE], char secondHalf[DECKSIZE]){
int count = 1, max = 0;
strcat(firstHalf, secondHalf);
for (int i = 0; i < (DECKSIZE*2); i = 2){
//printf("\n%c", firstHalf[i]);
if( !isdigit(firstHalf[i])) {
//printf(" is not a digit");
switch(firstHalf[i]) {
case 'T':
firstHalf[i] = 58;
break;
case 'J':
firstHalf[i] = 59;
break;
case 'Q':
firstHalf[i] = 60;
break;
case 'K':
firstHalf[i] = 61;
break;
case 'A':
firstHalf[i] = 62;
break;
}
}
if( firstHalf[i] == (firstHalf[i-2] 1) ) {
//printf(". Is ascending %c", firstHalf[i-2]);
count ;
}
else if (firstHalf[i] == 50 && firstHalf[i-2] == 62) {
//printf(". Is ascending %c", firstHalf[i-2]);
count ;
}
else {
if (count > max){
max = count;
}
count = 1;
}
}
return max;
}
很抱歉所有 printf 都在嘗試除錯。
uj5u.com熱心網友回復:
您誤解了如何strcat作業。
它不分配任何記憶體,它只從一個陣列復制到另一個陣列。
這也是一個危險的函式,因為在 C 中,字串只是字符陣列,它們strcat作為指標傳遞給它,所以它無法知道陣列有多大。
C 陣列不像 Java 陣列那樣是物件,并且不包含有關它們在運行時的大小的資訊。
所以,當你這樣做時:
strcat(firstHalf, secondHalf);
發生的情況是該函式在 中搜索第一個空字符 ( \0) firstHalf,然后開始復制secondHalf從該記憶體位置開始的內容。
它將繼續復制,直到在 中找到一個空字符secondHalf,即使它在 中耗盡了記憶體firstHalf。
它只會繼續破壞接下來的任何記憶體,并產生不可預測的結果。
這就是為什么有時你會得到段錯誤,有時是隨機資料。
你需要做這樣的事情:
char temp[(DECKSIZE*2) 1];
strncpy(temp, fistHalf, sizeof(temp));
strncat(temp, secondHalf, sizeof(temp));
這樣可以保證您有足夠的記憶體,并且使用strncat確保無論如何都不會超出此記憶體。
這就是第三個引數的用途——它告訴函式在找不到空字符的情況下可以復制的最大位元組數。
此外,由于您通過指標傳遞這些陣列,因此ascendingCount將修改原始陣列!
這就是為什么在連續呼叫這兩個函式時會有不同的行為。
C 中無法按值傳遞字串,因此如果您不想在函式呼叫之間丟失原始輸入,您可能希望使用臨時陣列進行修改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410343.html
標籤:
