2012-05-24 71 views
12
#include <stdio.h> 
int main(void) 
{ 
    int i,j,k; 
    char st; 
    printf("enter string\n"); 
    scanf("%s", st); 
    printf("the entered string is %s\n", st); 
} 

編譯上面的程序給我一個警告的說法:格式 '%s' 的預期類型 '的char *'

warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat] 
palindrom.c:8:1: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat] 

什麼我錯在這裏做什麼?

這是發生了什麼,當我運行它:

$ ./a.out 
enter string 
kiaaa 
the entered string is (null) 

編輯:

下面是代碼(由char st;char *st)的另一個版本:

#include <stdio.h> 
int main(void) 
{ 
    int i,j,k; 
    char *st; 
    printf("enter string\n"); 
    scanf("%s", st); 
    printf("the entered string is %s\n", st); 
} 

然而,它在運行時表現相同。

+0

現在你的'char * st;'是一個未初始化的指針。你不知道它指向哪裏。在scanf中訪問它是未定義的行爲。您必須使其指向足夠大的有效內存塊。要麼聲明一個數組'char st [100];' - 當作爲參數傳遞給'scanf'或'printf'時,數組名將被轉換爲一個指針,所以很好 - 或者將它聲明爲一個指針,並在使用它之前分配一些內存,'st = malloc(100 * sizeof * st);'。你需要'#include '作爲'malloc',並檢查'​​malloc'是否返回NULL。 –

回答

8

char st是一個單獨的角色。通過你的代碼的其餘部分來看,你可能是爲了宣佈一個字符數組:

char st[80]; 
1

你有一個類型不匹配。
scanf不安全,您需要提供正確的類型。 scanf使您能夠從輸入中獲取數據,並且需要告訴它您希望它讀取的數據的類型。你可以通過給它提供一個字符變量來指定%s來讓它讀取一個字符串。

你需要一個數組:

#define MAX_LENGTH 256 
char st[MAX_LENGTH]; 

由於@Jerry正確地指出,你可以只是簡單的避免所有的使用麻煩:
函數getline(),而不是使用scanf

+2

...然後指定調用'scanf'時的最大長度 - 照原樣,只用'%s'調用而不用調用'%255s'大致等同於調用'gets'。 –

+0

@JerryCoffin:很好,指出。謝謝 –

+1

這當然不是建議任何人使用'gets'(永遠)! –

-1

使用char *st;或陣列狀char st[50]

當你完成字符指針的使用情況,你應該釋放所使用的記憶指針。這可以通過使用free(st);函數來完成。

編輯:正如你打印字符串,如果你正在使用的指針,你可以這樣做:

printf("the entered string is %s\n",st); 
printf("the entered string is %s\n",*st); // This will work in both cases if you use char *st or char st[50] 
+1

如果您要推薦'char *',請同時推薦一種分配/釋放內存的方式。 – NPE

+0

如果我像char * st一樣使用它,那麼我應該如何去打印? 'char * st; printf(「enter string \ n」); scanf(「%s」,st); printf(「輸入的字符串是%s \ n」,* st);' –

+0

@RegisteredUser:繼續解決您的問題。或者你也可以使用printf(「輸入的字符串是%s \ n」,st); –

0

ST是char類型 & ST是char類型* 照顧的差異。 順便說一句,只有一個字符不能用來存儲字符串。使用char []數組。

1

scanf需要指向char*來指示您正在掃描字符串。

您正在提供一個在堆棧上分配的字符。

您要麼使用getchar(),要麼使st成爲char數組。

0

正如其他人所說,你要創建一個數組:

變化char st;char st[10];或任何大小的數組你想要的。

隨着上述變化st是一個數組,它有10個單獨的元素,可以容納一個單一的char值。

0

焦炭ST是即它的字符將只存儲一個字符嘗試這樣 main() char st [100]; scanf("%s",st); 只是改變這三條線,也將努力就惟獨一個字串 這裏聲明該函數作爲int值是int main()將其保存爲main(),它將工作

相關問題