PDA

查看完整版本 : C語言的指標問題請教


哈啦
2014-05-27, 04:49 PM
題目是,輸入一句英文,然後用指標的方法去寫,將全句分別改成全大寫和全小寫。

寫法如下:
#include <stdio.h>
#include <ctype.h>

int main(void)
{
char str[80];
char *p;

printf("enter a sentence:\n");
gets(str);
p=str;

while(*p)
{
*p=toupper(*p);
p++;
}

printf("%s\n",str);

p=str;/*reset p */
while(*p)
{
*p=tolower(*p);
p++;
}
printf("%s\n",str);
return 0;
}

我有二點疑問請教一下先進:
一是條件判斷的while(*p),我知道這表示如果*p為真,亦即*p不是0的話,該式就繼續下去。但字串陣列最後一個應是null,它的值就是0嗎?其他地方的值不會有0嗎?

二是第二個的p=str;/*reset p */,註解說是要reset p,為什麼要reset呢?我試過不reset p,直接用上面已經toupper(*p)之後直接 tolower(*p),結果確實就不印出小寫,而還是和上面一樣全部大寫。

可是根據我目前的想法,既然toupper() tolower()函式都是把字母變大寫或小寫,那麼假設這一句英文 Hello, World. 經過 toupper會變成 HELLO,WORLD.,然後我再直接把它 tolower(),應該也就變成 hello,world.,不是嗎?

thanks

yumi
2014-05-27, 10:31 PM
一、while(*p) 是判断字串是否到结束了,如果没有结束,就为真;若结束了,就为假。
二、如果不重置p=str的话,那么下面的while(*p)就是假的,根本进不了,也无法调用*p=tolower(*p)了。

哈啦
2014-05-27, 10:39 PM
一、while(*p) 是判断字串是否到结束了,如果没有结束,就为真;若结束了,就为假。
二、如果不重置p=str的话,那么下面的while(*p)就是假的,根本进不了,也无法调用*p=tolower(*p)了。

many thanks, 本來還想不太通,後來想得有點通了。

就是說,第一個while(*p)之後p++一直跑到盡頭了,此時如果再來一個while(*p)就等於是承接了剛才已跑到頭的p++的結果,自然就不會再跑一次。所以要再重置一次p=str。是這樣吧?

十分感謝。:bow

robowang
2014-05-28, 12:50 AM
C 語言的指標, 常讓初學者摸不著頭緒, 或似懂非懂
C 語言本身也是較低階的語言, 其實不是很適合初學者, 特別是年長的初學者~cici
我覺得如果要學程式設計, 或許可以考慮選擇別種高階語言來入門, 如 VB 或 Pascal 等等,
這樣比較容易, 也比較會有成就感

哈啦
2014-05-28, 01:03 AM
C 語言本身也是較低階的語言, 其實不是很適合初學者, 特別是年長的初學者~cici
我覺得如果要學程式設計, 或許可以考慮選擇別種高階語言來入門, 如 VB 或 Pascal 等等,
這樣比較容易, 也比較會有成就感

?:teeth

我本來就是要練習腦力不要太早老年痴呆的,所以沒有學習時間上的壓力,反正學一點是一點。對中老人來說,其實這些語言都不簡單學。:XD:

哈啦
2014-06-11, 04:33 PM
這個問題還有新的疑問請教一下。
#include <stdio.h>
#include <ctype.h>

int main(void)
{
char str[80],*p;
printf("enter a sentence:\n");
gets(str);
p=str;

while(*p)
{
*p=toupper(*p);
p++;
}
printf("%s\n",str);

return 0;
}

請問為何p=str和p=&str有何不同呢?我改成p=&str之後,程式得到的結果是一樣的。
再者下面,p++,我改成*p++,得出來的答案也是相同的。
而我個人目前的理解是,p=&str以及下面的*p++比較合乎所學的規則,只是不知答案雖一樣,但是否隱含什麼不可知的錯誤呢?

thanks