一、視頻學習
1、觀看視頻:1.2.2動態內存分配、1.3.1單字符輸入輸出、1.3.2字符串數組、1.4字符串函數
2、手寫筆記
3、代碼列表
4、遇到的問題
(1)問題:觀看視頻1.3.1中不理解為什么單字符輸入時要通過Ctrl+Z(Windows)或Ctrl+D(Unix)才能結束輸入。
結果:查閱相關信息得知視頻中所說的shell在遇到文件結束符(EOF)前仍會等待用戶輸入數據,正如視頻中翁愷老師在輸入一堆字符敲下回車后程序仍未結束。而Ctrl+Z與Ctrl+D相當於文件結束符(EOF)當shell接收到文件結束符時才結束程序。
(2)問題:在觀看視頻1.3.2程序參數時對於argv[1]、argv[2]等的輸出方式存在疑惑,不知怎么輸出。
代碼:
#include<stdio.h>
int main(int argc,char const *argv[]){
int i;
for(i=0;i<argc;i++){
printf("%d:%s\n",i,argv[i]);
}
return 0;
}
結果:錯誤嘗試: int main(int argc,char const *argv[]={,1354641,asfgasdg})、int main(int argc,char const *argv[]){char const*argv[]={51351,sdgds}}
詢問老師后得知,argv[x](x=!0)從DEVC++運行一欄的參數選項中添加
如圖:
二、PTA中遇到的問題
1、問題: PTA2-1以下不正確的賦值或賦初值的方式是( )。
A、char str[]="string";
B、char str[7]={'s', 't', 'r', 'i', 'n', 'g'};
C、char str[10];str="string";
D、char str[7]={'s', 't', 'r', 'i', 'n', 'g', ’\0’};
知識點:字符串定義方式①char s1[]={'a','b','c','\0'};(字符串數組)
②char s2[]="abc";(字符串數組)
③char *sp="abc";(字符串指針)
答案:C,C選項直接對str[1]進行了賦值,然而指針常量不能直接賦值。
2、問題:字符串數組與字符串指針區別
區別:①. ”讀“ ”寫“ 能力
char *a = “abcd”; 此時"abcd"存放在常量區。通過指針只可以訪問字符串常量,而不可以改變它。
而char a[20] = “abcd”; 此時 "abcd"存放在棧。可以通過指針去訪問和修改數組內容。
②. 賦值時刻
char *a = “abcd”; 是在編譯時就確定了(因為為常量)。
而char a[20] = “abcd”; 在運行時確定
③. 存取效率
char *a = “abcd”; 存於靜態存儲區。在棧上的數組比指針所指向字符串快,因此慢。
而char a[20] = “abcd”; 存於棧上,更快。
3、問題:5-1消除空格判斷是否回文
代碼:
#include <stdio.h>
#include <string.h>
int main(void) {
char s[80], ch, *p, *q;
int i, j, n;
gets(s);
p = ;
while ( *p == ' ')
;
n = strlen(s);
q = ;
while ( *q == ' ')
;
while ( && *p ==*q) {
p++;
;
}
if ( p<q )
printf("NO\n");
else
printf("YES\n");
return 0;
}
結論:消除前空格易想到從數組首位數據開始逐一往后判斷是否為' ',而消除后空格易想到從數組末位數據開始逐一往前判斷是否為' '。根據代碼信息while ( *p == ' ')______;與while ( *q == ' ')_____;觀察到這兩個語句中的*p與*q分別與' '進行比較,故作用極有可能為消除前后空格。 前者由前置語句p=__;組成易得p=s;while ( *p == ' ')p++;。后者有前置語句n=strlen(s);q=__;可得q=s+n-1;while ( *q == ' ')q--;題目要求在消除空格后判斷回文,易得回文形式為s[0]==s[n-1];s[1]==s[n-2]······s[(n-1)/2-1/2]==s[(n-1)/2+1/2](n-1為奇數)或s[(n-1)/2]==s[(n-1)/2](n-1為偶數)。由先前的代碼信息基本可以確定消除空格后p將指向數組s的首位數據(非' '),而q將指向數組s的末尾數據(非' ')則回文判斷可簡化為判斷*p是否與*q相等再將p和q移向下一位當到達p==(n-1)/2-1/2和q==(n-1)/2+1/2或者p==(n-1)/2-1與q==(n-1)/2+1時進行最后一次判斷再移向下一位,通過判斷q與p最終指向的位置是否相等或p>q至此得出數組s是否為回文既if ( p<q )printf("NO\n");else printf("YES\n");。易得題中控制條件的語句為while(____&&*p==*q)已有*p與*q是否相等的判讀指向再判斷p是否超過(n-1)/2-1/2與q是否超過(n-1)/2+1/2或者p是否超過(n-1)/2-1與q是否超過(n-1)/2+1,既p是否小於q。故此空填p<q;而后續由p++;可得在while語句中要實現的功能是兩個指針由兩邊不斷地往中間移位,故下一句填q++;。
答案:(1)s(2)p++(3)s+n-1(4)q--(5)p<q(6)q--
4、問題:PTA2-2假設scanf語句執行時輸入ABCDE<回車>,能使puts(s)語句正確輸出ABCDE字符串的程序段是__。
A、char s[5]={"ABCDE"}; puts(s);
B、char s[5]={'A', 'B', 'C', 'D', 'E'}; puts(s);
C、char *s; scanf("%s", s); puts(s);
D、char *s; s="ABCDE"; puts(s);
答案:D
結論:puts(s)在遇到 '\0'前會一直輸出下去直到遇到不可識別的數據故A、B輸出不正確或偶然輸出正確。而C選項沒有提前給指針s分配足夠的空間故錯誤。