我寫了一個C程序,它從用戶處接收字符串輸入並將其打印在屏幕上。(空)
int main (void)
{
char* string;
scanf("%s", string);
printf("%s", string);
return 0;
}
但是輸出是不希望的。
我給了輸入foo
。程序打印出(null)
。誰能解釋爲什麼?
我寫了一個C程序,它從用戶處接收字符串輸入並將其打印在屏幕上。(空)
int main (void)
{
char* string;
scanf("%s", string);
printf("%s", string);
return 0;
}
但是輸出是不希望的。
我給了輸入foo
。程序打印出(null)
。誰能解釋爲什麼?
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;
}
你沒有分配內存以string
。因此,通過寫入未初始化的指針,您可以調用undefined behavior。
在您使用string
,或者你在使用動態malloc()
或家庭分配內存,或定義string
是一個數組,像char srting[32]
什麼的。
此外,FWIW,它始終是更好地被分配的內存限制你輸入的大小,像
scanf("%31s", string);
從緩衝區溢出保護時間長於預期輸入的情況下。
scanf
不爲string
分配任何內存;你需要在調用函數之前自己做這件事。否則你的程序行爲是undefined。
一個簡單的方法是將重構爲char string[100];
說,和希望是scanf
不嘗試讀取超過99個字符加上空終止符。
之後,你會意識到希望太多了,最終會寫出你自己的I/O函數。
成爲一個天使,並把'免費'在那裏的地方... – Bathsheba
@Bathsheba,這是我覺得我們應該有笑臉支持SO評論中的一個.. Thanx :) – Haris
你應該檢查'string'在第二個例子中用'NULL'替換**%s **並用**%99s **替換。 – Michi