2012-11-12 249 views
0

Input: Hello there boy(any 80 character string)邏輯錯誤

Expected output: boy there Hello

Current output: (nothing - does compile though) \

我的HW提示:

收件,提示用於由一個或多個空格分隔單詞序列的用戶的程序,每個單詞都是一個字母數字字符序列。您可以假定輸入的文本字符串長度不超過80個字符,每個單詞長度不超過20個字符。使用fgets()命令讀取輸入文本字符串。例如,我們可以聲明一個char數組char [81];然後使用fgets(句子,81,stdin);從標準輸入標準輸入(即鍵盤輸入)中最多讀取80個字符到字符數組句子[]中,該字符串還將在數組末尾插入一個空字符(字符串終止字符);這就是爲什麼數組需要比輸入文本長一個字節的原因。你的程序應該以相反的順序打印出單詞,正如每個單詞之間只有一個空格輸入一樣。您可以假定沒有輸入標點符號或控制字符。您的程序應該命名爲reverse_words.c,並且您的輸出應該與下面示例中顯示的輸出完全匹配。

我看了其他的例子,只是想用我所知道的來製作這個程序。對我來說,它似乎工作,但它沒有。有人能幫我找到我的邏輯關閉嗎?

#include <stdio.h> 


int main() 
{ 
    char sentence[81]; 
    char space[81]; 
    int i , h = 0, j, start; 

    printf("Enter a sentance (up to 80 characters): "); 
    fgets(sentence,81,stdin); 

    //starting backwards go from element 80 to find first non space 
    //make array to store element numbers of sentence in new array 
    for(i = 80; i >= 0; i--) 
    { 
    if(sentence[i] != ' ' || sentence[i] != '\0') 
    { start = i; 
     //printf("%i", start); 
    } 
    if(i < start && i == ' ') 
    { 
    space[h] = i; 
    h++; 
    } 
} 

h = 0; 

    //start at first space and print characters till next space, repeat till all words printed 
    for(j = space[h]; j < space[h + 1]; h++) 
    { 
    printf("%c", sentence[j]); 
    if (j == space[h + 1]) 
     printf(" "); 
    } 
    return 0; 
} 
+0

這是什麼意思'我==」「'你正在做in'如果'條件 – Omkant

+0

再次看我認爲它應該是句[我] ==''。我試圖找出單詞之間的所有空格。防爆。嗨'_'there'_'boy –

+0

如果它不能改變問題的目的,或者問題仍然存在,您可以隨時編輯您的帖子並修復錯誤。 – ForceMagic

回答

2

從粗略地看一眼

if(i < start && i == ' ') 

更改爲

if(i < start && sentence[i] == ' ') 

其他的事情你可以改善:

80不循環,而不是發現輸入的字符串的長度然後倒退。使用strlen

0

的代碼,這部分可以被清理了一下:踏着由80個字符後面的

//starting backwards go from element 80 to find first non space 
//make array to store element numbers of sentence in new array 

相反,只取sentencestrlen()的:

printf("Enter a sentence (up to 80 characters): "); 
fgets(sentence, 81, stdin); 
start = (int) strlen(sentence) - 1; /* subtract one to account for null character */ 

然後你的工作方式從該值返回:

for (i = start; i >= 0; i--) { 
    /* ... */ 
} 

您也可以通過定義和使用常數來表示一個句子的最大長度提高代碼的質量一般:

#define MAX_SENTENCE_LENGTH 80 
... 
char sentence[MAX_SENTENCE_LENGTH + 1]; 
char space[MAX_SENTENCE_LENGTH + 1]; 
... 
printf("Enter a sentence (up to %d characters): ", MAX_SENTENCE_LENGTH); 
fgets(sentence, MAX_SENTENCE_LENGTH + 1, stdin); 

然後,如果你想用不同的限制,你只需要改變代碼在一個地方。

0

下面是代碼嘗試運行此:

int len=strlen(sentence); 
    for(i=0;i<len;i++) 
     space[i]=sentence[len-1-i]; 
    space[i]='\0' 
int start=0,end; 
for(i=0;i<=len;i++) 
    { 

     if(space[i]!=' ' || space[i]!='\0') //edited in place of && it should be || 
     {} 
     else 
     { 
      end=i-1; 
      str_rev(&space[start],&space[end]); 
      start=i+1; 
     } 
    } 


    void str_rev(char *s,char*e) 
    { 
     while(s>e) 
     { 
     char tmp=*s; 
     *s=*e; 
     *e=tmp; 
     s++;e--; 
     } 
    } 
+0

有一些警告... reverse_words.c:67:39:警告:多字符字符常量 reverse_words.c:函數'main'中: reverse_words.c:71:警告:隱式聲明函數'str_rev' /tmp/ccdZzmLZ.o:函數'main': reverse_words.c :(.text + 0x138):未定義的引用'str_rev' collect2:ld返回1退出狀態 –

+0

嘗試聲明'str-rev ()'在調用'str_rev()'之前在頂部,並且編輯代替'&&'它應該是'||' – Omkant

+0

如果實際定義低於調用環境,則始終提供函數聲明 – Omkant

0

正如我在評論說,這是一個遞歸問題完美。這就是爲什麼我想分享這個解決方案。當然,不使用它,除非你完全明白髮生了什麼:)

#include <stdio.h> 

void PrintWordsInReverseOrder(char* sentence) 
{ 
    // Search beginning of word (skipping non-readable characters <= ' ') 
    char* start = sentence; 
    while ((*start != '\0') && (*start <= ' ')) start++; 
    if (*start == '\0') return; // this is the end my friend 
    // Search end of word (skipping readable characters > ' ') 
    char* end = start; 
    while (*end > ' ') end++; // will also stop at '\0' 
    if (*end != '\0') 
    { // We are not at the end of the string, so there might be a next word available. 
     // Print the next word using recursion (this causes to print out the last word first) 
     PrintWordsInReverseOrder(end + 1); 
    } 
    char endBackup = *end; 
    *end = '\0'; // temporary terminate the word so we can print it out (don't be affraid, we have a backup in endBackup) 
    printf(start); 
    printf(" "); 
    *end = endBackup; // restore word termination char 
} 

int main() 
{ 
    char sentence[81]; 
    printf("Enter a sentance (up to 80 characters): "); 
    fgets(sentence, sizeof(sentence), stdin); 
    PrintWordsInReverseOrder(sentence); 
    return 0; 
} 
+0

一級棒!謝謝,但我有點失去了指針。我的硬件是星期二到期的,所以我仍然有時間查看這個,但現在我必須去。如果你可以自由地幫助,我會在更多的指點之後明天發佈問題。 –

0

試試這個:)

#include <stdio.h> 
    #include <conio.h> 

void main() 
{ 
    int x=0,y=0,t,i=0,j=1,k=0,p[10]; 
    char a[80],b[80]; 
    clrscr(); 
    printf(" enter a string "); 
    gets(a); 
    p[0]=0; 
//count char in string 
while(a[i]!= '\0') 
{ 
    i++; 
    //array p[] note the space posi in string 
    if(a[i]==' ') 
    { 
    p[j]=i; 
    j++; 
    } 
} 
k=i; 
t=0; 
//loop till space to next space 
for(j=j-1;j>=0;j--) 
{ x=p[j]; 
    y=x; 
    //reposi the words 
    while(x<k) 
    { 
     //put space when it come to first posi bcuz at d beginin der is no space 
     if (x==0) 
     { 
     b[t]= ' '; 
     t++; 
     } 
     b[t]=a[x]; 
     t++;x++; 
    } 
    k=y; 
} 
puts(b); 
getch(); 
}