(DevC++)怎麼把不同長度的字放到同一個陣列或字串?

2010-05-02 6:03 am
#include <stdio.h>
#include <stdlib.h>
void name();
char Name[20]={0};

int main()
{
int i=0;
char x;
name();
while(1)
{
printf("是否繼續輸入(y/n)? ");
scanf("%s", &x);
if(x=='y')
{
name();
}
else if(x=='n') break;
}
system("pause");
}

void name()
{
printf("輸入名字: ");
scanf("%s", &Name);
}
以上是我目前會寫的@@

我希望程式可以讓使用者輸入一些名字後,放到同一個陣列或字串裡
然後使用者按n不再輸入後,可以輸出:
第1個人的名子:XXX
第2個人的名子:WWW
第3個人的名子:YYY ...依此類推

希望有高手能教我~感恩!^^
更新1:

回 耗呆小綿羊 請問這個程式要怎麼知道第一個人是誰、第二個人是誰、第三個人是誰? 如果我指定要讀取第3個輸入的名子,要怎麼讀取呢? 麻煩高手了~~~

更新2:

回 Jacob Lee 請問有什麼簡單的方法?? 用二維也可以,方法不限,只要有我需要的效果就好了~ 感恩~^^

更新3:

回 Wu 您的程式碼,輸出沒有顯示名字耶 只有顯示: 第一個人: 第二個人: ... 請問這是什麼原因呢??

更新4:

回 Wu 我把Name[20]宣告成全域變數,就會顯示名字了~ 不過顯示的名字全都是最後一個輸入的名字=.=

更新5:

回 東邪無弓 可以幫我解釋副程式裡do while每一行指令的意義/意思嗎? 那些我看不太懂XD 還有,為什麼是return --count; 而不是return count--; 麻煩幫我解釋了~感恩^^

更新6:

請問 為什麼Jacob Lee說scanf("%s", &Name);是錯的! 如果我想用scanf讓使用者輸入名字到Name[3], 不能用scanf("%s", &Name[3]);嗎? 那正確的用法是什麼呢?

更新7:

那我想讓使用者的輸入放到陣列的第3個 為什麼以下會錯?? 還是我的邏輯錯了?@@ #include #include int main() { char *name[100]; scanf("%s", &name[2]); printf("%s\n",name[2]); system("pause"); return 0; } 不好意思,學c沒多久,麻煩各位教我了~^^

更新8:

那判斷他是不是英文怎麼寫? 寫成以下這樣會錯=.= for (i=0; i < 5; ++i) { name[i] = (char*) malloc(20); //20是輸入的字數上限19,可自行增減 scanf("%s", name[i]); } length = strlen(name[0]); for (i=0; i

更新9:

for (i=0; i

更新10:

for (i=0; i

更新11:

它不給我顯示@@ 以下是圖片 http://img404.imageshack.us/img404/7258/38247254.jpg

更新12:

好,我了解了! 感謝您的提醒^^

回答 (6)

2010-05-02 9:23 pm
✔ 最佳答案
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFSIZE 60000
#define NUM 200
size_t enterName(char **name, char * buff);

int main(void)
{
size_t i, count;
char *name[NUM];
char *buff = (char*) malloc(BUFFSIZE); //自訂輸入資料儲存區

count = enterName(name, buff);

printf("\n輸入內容如下:\n");
for (i = 0; i < count; ++i)
printf("第 %d 位的姓名: %s\n", i+1, name[i]);

free(buff);

system("pause");
return 0;
}

size_t enterName(char **name, char * buff)
{
size_t len , len1, count;
len = 0; count = 0;
do {
printf("請輸入第 %d 位的姓名(只按ENTER則結束):", count+1);
name[count] = buff + len;
gets(name[count]);
len1 = strlen(name[count++]);
len = len + len1 + 1;
if (len > BUFFSIZE)
{
printf("buffer full!\n"); break;
}
} while (len1 && count < NUM);
return --count;
}

字串指標陣列配合自訂資料儲存區,可做到題目的需求。
題目欲用按YN來決定是否繼續,我不喜用此法,
改用判斷若輸入空行(即只按ENTER)便結束,輸入過程更加流暢!

這僅是粗略的示範此一用法,若付諸實際應用,還有一些細節要處理,才算完備。但那已是題外話了,不適在此贅述。

2010-05-04 00:22:01 補充:
一開始 len = 0; count = 0;
進入迴圈後

name[0] = buff + 0 = buff
即令指標指向資料區的起始位址
gets(name[0]) 會把輸入內容存至上述指標所指位址
len1 = 上述輸入字串的長度(為便於解說,假設為10)

len = len + len1 + 1 =0+10+1=11
會令len = 已存至資料區的字元數(含字串尾零)

2010-05-04 00:30:54 補充:
由於count遞增一時,包含空字串的那次,故要 --count.

2010-05-04 00:32:07 補充:
字數已達上限,知識+禁制補充說明。

2010-05-04 00:34:34 補充:
我改至意見欄略述。

2010-05-09 14:03:48 補充:
這題的問答已太雜了,不適再進一步問答!
因為在意見欄貼程式碼,很不雅觀!
況且你的補問已偏離原題意旨,會讓題文更為紊亂。
2010-05-02 8:56 pm
如果要偷懶的話
可以用c++ 的 collection
2010-05-02 8:10 pm
一個二維陣列可以嗎?

2010-05-02 12:47:01 補充:
Sorry ,
沒注意到前的對話,
真搞笑,哈^^

2010-05-02 20:27:44 補充:
以和為貴,以和為貴。
相信Jacob大 只是就事論事,並無惡意,
請羊大 冷靜,
凡事 以和為貴,以和為貴。
2010-05-02 3:34 pm
原始碼:http://gist.github.com/386428

2010-05-02 20:59:45 補充:
假如你不想事先輸入人數的話,可以考慮使用鏈結串列。
2010-05-02 2:04 pm
scanf("%s", &Name);
是錯的!
2010-05-02 7:57 am
void name(int i)
{char Name[20],x;
printf("輸入名字: ");
scanf("%s", &Name);
printf("是否繼續輸入(y/n)? ");
scanf("%s", &x);
if(x=='y') name(i+1);
printf("第%d個人的名子:%s\\n",i,Name);
}
void main()
{name(1);
}

2010-05-01 23:58:37 補充:
但是次序反轉了....

2010-05-02 11:51:32 補充:
對,這個沒留意到。只是照抄版主的!
在ⅤC++下, 這郤不是問題.

2010-05-06 23:18:14 補充:
scanf("%s", &Name);是錯的, 要用scanf("%s", Name);


收錄日期: 2021-04-28 23:15:49
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20100501000015KK08719

檢視 Wayback Machine 備份