1樓:匿名使用者
格式"%s"輸入字串到字元陣列不需要加取址符&
2樓:
你說對了啊。對一個字串指標來說,在scanf函式中「要」與「不要」都能得到正確結果,你可以放心使用。如果你用了&發現有問題,那就趕快告訴我,讓我也長進一下。
原因是這樣的:scanf把變數列表中的&解釋為單純的取地址,都轉化成了指向字串首字元的指標。如果有char a[10];,則a是這10個字元的第一個字元的地址,&a是這10個字元組成的字串的首地址,但二者的「值」一樣的,因為10個人站在那裡,第一個人的地方也是這一排人排頭的地方。
區別在於:a+1是第二個元素的地址,而&a+1是第二排的首地址,跑到a[9]後面的那個元素的地址上了。而scanf在接收字串時對後者的意義是不理會的,還按一個字元一個字元地向後安排讀取,所以用了&仍然是正確的。
不過為便於閱讀和規範,在下覺得不用為好。
3樓:匿名使用者
對於格式"%s",對應的引數應該是地址。作為字元陣列的product1.cname、product1.
cshape等,用作函式實參時,會被自動轉化為指標,指標指向的就是地址,所以不需要加取址符&,所以
scanf("%s",product1.cname);是對的,而scanf("%s",&product1.cname);是錯的。
4樓:倒黴熊
不需要啊 陣列名就代表陣列的首地址啊。
為什麼c語言scanf函式對字串不要加 取地址運算子&
5樓:匿名使用者
c語言的字串為陣列形式,而陣列的名稱可以表示其地址,故對字串輸入不需要加地址符。而單獨的字元、整型變數等的名稱不能直接表示地址,故需要加地址符。
資料型別
字串資料型別是建模在形式字串的想法上的資料型別。字串是幾乎在所有程式語言中可以實現的非常重要和有用的資料型別。
在某些語言中它們可作為基本型別獲得,在另一些語言中做為複合型別獲得。多數高階語言的語法允許通常用某種方式引用起來的字串來表示字串資料型別的例項;這種元字串叫做「文字」或「字串文字」。
擴充套件資料
字串c語言的字串其實就是以'\0'字元結尾的char型陣列,使用字元型並不需要引用庫,但是使用字串就需要c標準庫裡面的一些用於對字串進行操作的函式。它們不同於字元陣列。使用這些函式需要引用標頭檔案。
檔案輸入/輸出
在c語言中,輸入和輸出是經由標準庫中的一組函式來實現的。在ansi c中,這些函式被定義在標頭檔案;中。
標準輸入/輸出
有三個標準輸入/輸出是標準i/o庫預先定義的:
1、stdin標準輸入
2、stdout標準輸出
3、stderr輸入輸出錯誤
6樓:匿名使用者
字串名字就代表字串的首地址,因此不需要加&。
字串在儲存上類似字元陣列,所以它每一位的單個元素都是可以提取的,如s=「abcdefghij」,則s[1]=「b」,s[9]="j",而字串的零位正是它的長度,如s[0]=10。
在程式設計中,字串(string)為符號或數值的一個連續序列,如符號串(一串字元)或二進位制數字串(一串二進位制數字)。
char greeting[6] = ;
依據陣列初始化規則,可以把上面的語句寫成以下語句:
char greeting = "hello";
擴充套件資料:
函式應用
1. 連線運算 concat(s1,s2,s3…sn) 相當於s1+s2+s3+…+sn。
例:concat(『11』,'aa』)='11aa』;
2. 求子串。 copy(s,i,i) 從字串s中擷取第i個字元開始後的長度為l的子串。
例:copy(『abdag』,2,3)=』bda』;
3. 刪除子串。過程 delete(s,i,l) 從字串s中刪除第i個字元開始後的長度為l的子串。
例:s:=』abcde』;delete(s,2,3);結果s:=』ae』;
4. 插入子串。 過程insert(s1,s2,i) 把s1插入到s2的第i個位置。
例:s:=abc;insert(『12』,s,2);結果s:=』a12bc』;
5. 求字串長度 length(s) 例:length(『12abc』)=5。
在asp中 求字串長度用 len(s)例: len("abc12")=5。
7樓:
c的輸入函式是scanf而非scanf。
c沒有字串變數,字串是用字元陣列處理的。陣列的特點是陣列名有雙重身份:既是陣列名又是這個字串第一個字元的地址,也就是這個字串的首地址。
所以當有char a[10]的宣告後,scanf("%s",a)和scanf("%s",&a)都是合法的,前者a是指標身份,後者a是陣列名身份;無論早期的c還是現在的c都是認可的。
8樓:匿名使用者
因為scanf要獲取變數的地址才能把讀到的內容存放在這個變數裡
你說的字串是c風格字串,c風格字串變數本身就是這個字串的首地址,所以無需加&
9樓:匿名使用者
因為字串 名本身就是一個指標。 如: char a[100]; a就是指標,指向陣列首地址。
而 int a; a 是整形變數,要用scanf來讀取資料放入 記憶體, 要訪問記憶體區域,要通過地址來訪問
所以要加上&, 通過&a來訪問記憶體區域。
10樓:匿名使用者
字串的變數名稱就是這個字串的首地址了
既然已經是地址了,就不用再取地址了
11樓:非常老
編譯器認為字串代表地址。
12樓:落單毛毛蟲
c語言的字串實際上是 字元陣列.
既然是陣列, 那麼陣列頭自然是一個指標.
char str = ;
這個str實際上是一個不可變的字元指標.
scanf的引數要求傳入指標. 之後按照格式化字串對指標指向的地址賦值..
str本身就是一個指標了, 所以不需要&str,如果&str, 那麼得到是就是指標的指標,scanf並不只是對字串不加 取地址運算子.
例如 int arr = ;
scanf("%d", arr);
這裡對arr照樣不需要取地址運算子, 因為arr是陣列頭, 本身就是一個指標.
上面的語句是對arr陣列的第一個元素賦值, 就是arr[0];
當然也可以這麼寫.
scanf("%d", &arr[0]);
arr[0]是一個值, 並非指標, 於是對其取地址.
對於字串也可以這麼寫.
char str[3] ;
scanf("%c", &str[0]);
這是對str的第一個元素賦值也就是 str[0];
不知道你看懂了沒有?
13樓:匿名使用者
因為字串 char *str:本身就是指標變數
請教c語言字串和字元陣列的比較問題
14樓:yuanyuan源遠
利用fgets()取得一個字串,直到讀取到"回車"符,而你得到的字串中含有「回車」(ascii:10),比你要比較的字串多一個「回車」,所以strcmp()比較結果一直不為零。
如第一次while迴圈的結果:
15樓:it孤鶩
#include
#include
#include
int main(void)
fclose(fp);
system("pause");
return 0;
}上面的**更靠譜
你用過用fgets 那麼處理的字串後面一直要加'\0'
16樓:匿名使用者
fgets()到buff後,沒有\0結束標記
17樓:餘煙琦釵
c語言的字元陣列有兩種,比較方式也有所不同。
1字串。
c語言的字串是用字元陣列表示的。約定以'\0'(ascii碼0)作為結尾標記。
對於字串類的字元陣列,可以用string.h中的strcmp函式進行比較。
intstrcmp(char
*str1,
char
*str2);
其比較規則為:
a,從左向右依次比較每個元素;
b,如果出現str1的元素ascii碼比較大,則返回1;如果出現str2元素ascii碼比較大,則返回-1。如果相等,則繼續。
c,如果一直相等,直到遇到\0,這時檢查是否均為\0,如果均為\0,那麼返回0;
d,如果str1到\0,而str2沒到,返回-1;
否則返回1。
總結規則就是,如果str1比str2大,返回1;如果相等,返回0;如果str1小,返回-1。
2不帶\0結束的字元陣列。
對於此類陣列,沒有庫函式可供使用,只能自己寫函式進行比較。規則可以仿照strcmp的規則。
由於沒有\0作為結束,所以引數中必須傳入每個陣列的元素個數。
int char_array_cmp(char *s1, int l1, char *s2, int l2)
C語言字串問題,C語言字元陣列與字串問題
字串初始化,如果逐個賦值的話,系統不是會自動新增 0 嗎不是。圖一就是長度為4的陣列,圖二長度為5圖三會是新增 0,但是是會把後面所有的都設為 0因為圖一和圖四不以 0結尾,所以不能用strlen和strcmp,會越界 圖四也可以用char str 4 stop 這樣賦值。如果不手動加長度就會是5了...
C語言字元陣列與字串問題,C語言中將字串賦值給字元陣列的問題
渿河 這是在定義時初始化 如果你的右邊花括號內的字元個數少於 陣列元素個數 那麼其餘的陣列元素將會初始化為0 0 的ascii碼的值就是0 如果你不指定陣列元素個數 編譯器會自動幫你計算出元素個數的 char c 10 這個是已經給定了陣列的大小,達不到陣列大小的長度的話會自動添零的 c語言中將字串...
c語言的字元陣列和字串的區別,C語言的字元陣列和字串的區別
u愛浪的浪子 1 長度不同 對於字元陣列,其長度是固定的,其中任何一個陣列元素都可以為 null 字元。因此,字元陣列不一定是字串。字串的結尾是以null 字元結尾,所以長度會有所不同。2 結尾不同 對於字串,它必須以 null 字元 也就是 0 用十六進位制表示為 0x00 結尾,其後的字元不屬於...