2015-11-10 55 views
2

我寫了一個C程序,它從用戶處接收字符串輸入並將其打印在屏幕上。(空)

int main (void) 
{ 
    char* string; 
    scanf("%s", string); 
    printf("%s", string); 
    return 0; 
} 

但是輸出是不希望的。

我給了輸入foo。程序打印出(null)。誰能解釋爲什麼?

回答

5
char* string; 

這只是指向char的指針。它並沒有指向任何記憶。您需要爲您想要的字符分配內存。


可以使用malloc()

#include<stdio.h> 
#include<stdlib.h> 

int main(void){ 
    char *string; 
    string = malloc(100); //string of length 100 

    if(string == NULL){ 
     printf("Error\n"); //if malloc() fails 
    } 

    if((scanf("%99s", string)) != 1){ //if scanf() fails 
     printf("Error, Fix it!\n"); 
     exit(1); 
    } 
    printf("%s\n",string); 

    free(string); 
    return 0; 
} 

或者分配內存,使用數組

#include<stdio.h> 
#include<stdlib.h> 

int main(void){ 
    char string[100]; 

    if((scanf("%99s", string)) != 1){ 
     printf("Error, Fix it!\n"); 
     exit(1); 
    } 
    printf("%s\n",string); 

    return 0; 
} 
+6

成爲一個天使,並把'免費'在那裏的地方... – Bathsheba

+1

@Bathsheba,這是我覺得我們應該有笑臉支持SO評論中的一個.. Thanx :) – Haris

+0

你應該檢查'string'在第二個例子中用'NULL'替換**%s **並用**%99s **替換。 – Michi

3

你沒有分配內存以string。因此,通過寫入未初始化的指針,您可以調用undefined behavior

在您使用string,或者你在使用動態malloc()或家庭分配內存,或定義string是一個數組,像char srting[32]什麼的。

此外,FWIW,它始終是更好地被分配的內存限制你輸入的大小,像

scanf("%31s", string); 

從緩衝區溢出保護時間長於預期輸入的情況下。

3

scanf不爲string分配任何內存;你需要在調用函數之前自己做這件事。否則你的程序行爲是undefined

一個簡單的方法是將重構爲char string[100];說,和希望scanf不嘗試讀取超過99個字符加上空終止符。

之後,你會意識到希望太多了,最終會寫出你自己的I/O函數。