關於字符串和動態分配內存的學習


一、視頻學習

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分配足夠的空間故錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM