2017-10-20 72 views
-2

我想用putchar()和getchar()從用戶中讀取一串字符,然後我的循環將打印每個字符三次,打印新行等等,直到變量「userInput」中的每個字符都已經打印完畢。當我嘗試編譯我的節目,我收到以下錯誤:使用putchar()和getchar()打印單個字符

warning: assignment makes pointer from integer without a cast [enabled by default] 
userInput = getchar(); 
     ^
warning: comparison between pointer and integer [enabled by default] 
while(counter < strlen(userInput)) 
      ^
error: array subscript is not an integer 
    putchar(userInput[counter]); 
        ^
error: array subscript is not an integer 
    putchar(userInput[counter]); 
        ^
error: array subscript is not an integer 
    putchar(userInput[counter]); 
        ^

如何解決這些錯誤?我是C新手,無法弄清楚指針轉換錯誤的意義,以及爲什麼我的計數器變量不起作用。

我的代碼如下:

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

int main(void) 
{ 
    char *userInput; 
    int *counter = 0; 

    printf("Enter a string of characters: "); 
    userInput = getchar(); 


    while(counter < strlen(userInput)) 
    { 
     putchar(userInput[counter]); 
     putchar(userInput[counter]); 
     putchar(userInput[counter]); 
     printf("\n"); 
     counter++; 
    }  
} 
+0

'getchar'讀取*一個*字符,而不是一串字符。 – gurka

回答

1

我真的不知道你爲什麼要做到這一點,但如果我不得不這樣做,我可能會做這樣的 -

01 #include <stdio.h> 
02 int main() 
03 { 
04  char userInput[100],c; 
05  int length, i=0; 
06 
07  printf("Enter a string of characters: "); 
08  while(c=getchar()){ 
09   if(c=='\n') 
10    break; 
11   userInput[i++] = c; 
12  } 
13  userInput[i]='\0'; 
14  length = i; 
15 
16  for(i=0; i<length; i++){ 
17   putchar(userInput[i]); 
18   putchar(userInput[i]); 
19   putchar(userInput[i]); 
20   putchar('\n'); 
21  } 
22  return 0; 
23 } 

我已經添加行號爲了更好的理解。 這裏是我做了什麼 -

  • 我不需要任何其他的頭文件除外stdio.h中,所以刪除臨時演員。
  • 您可能需要一個字符串(字符數組),所以您必須像第04行那樣將其定義爲字符數組。由於getchar()返回一個字符,因此將它分配給一個char指針會給出錯誤。另外我聲明瞭一個變量「c」,你會在後面看到。
  • 而不是計數器,我使用標準我,並宣佈一個可變長度來存儲字符串的長度。
  • 第08行中有趣的事情,while(c = getchar())。只要輸入流中存在一個字符(由用戶輸入),它就會持續讀取字符並將其存儲在變量c中。
  • 在第09行中,我檢查c是否包含換行符(即用戶按下Enter/Return鍵)。如果是這樣的話,我停止閱讀字符串,並使用第10行中的break關鍵字跳出循環。
  • 在第11行中,我將字符c存儲在userInput數組的第i個索引處,並將i同時。你可以在兩行中做同樣的事情。
  • 在第13行中,i的值將是輸入字符串的長度。在最後一個索引處,我存儲了一個特殊字符'\ 0',它是空終止符。你可以查看它瞭解更多。
  • 在第14行中,我將長度變量i的值存儲起來。
  • 從第16-21行開始,我運行一個簡單的for循環,從i = 0到length,並且在每次迭代中,我都會按照您的意願打印該字符3次。在第20行中,而不是printf(),我使用putchar()來打印一個新行,因爲'\ n'是一個字符,只是爲了向您顯示。

所以這就完成了你想要的任務。我試圖儘可能使初學者友好,並對任何疑問發表評論。 很高興提供幫助。 :)

-1
  1. 的getchar()返回一個單個字符爲unsigned int。你必須將其轉換爲char來避免警告。
  2. getchar返回一個int,它不分配任何東西。
  3. 據說它讀了一個字符,所以你不能循環。

我認爲你應該搜索fgets或scanf或者在循環中調用getchar(),但是你需要使用特定的char來退出循環。

0

如果你想使用字符指針來存儲數據,你需要有一個現有的字符串,你可以使這個字符指針指向,或者你需要動態分配的字節數,然後可以用於存儲新數據。

char *string = malloc(50); 

相當於

char string[50]; 

也整數並不需要是一個指針,如果你只存儲一個值。因此,它應該只是

int counter=0; 

在節目中你寫信了, 的getchar()只需要一個單一的字符

您應該使用字符串處理函數一樣獲取(串); 要做到這一點 它會讓事情變得更容易

相關問題