[英]Illegal Instruction 4 :(
#include <string.h>
#include <stdlib.h>
int main() {
char getInput[20];
scanf("%s", getInput);
char append[] = "word";
printf("%s\n", strcat(append, getInput));
return 0;
}
為什么這會給我非法指令 4
更喜歡將 fgets 用於固定緩沖區,並確保為空終止符留出空間(並檢查輸入是否被截斷)。
或者,您可以使用 scanf 進入固定緩沖區,並且可以使用巧妙的技巧來確保您不會溢出固定緩沖區。 或者您可以使用“%as”標志(如果您的編譯器支持的話)。
請注意,當您使用動態分配時,您需要自己清理。 這就是為什么這么多人更喜歡為您執行 memory 清理/內務處理的垃圾收集語言。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char*
checkin(char* p) {
if( !p ) return(p);
if (0 == sizeof(p) ) {
printf("error: read empty!\n");
return NULL;
}
int plen = strlen(p);
if ('\n' != p[plen - 1]) {
printf("error: input overflow (too long)!\n");
return NULL;
}
return(p);
}
char*
wrap(char* p) {
char append[] = "word";
printf("%s%s\n",append,p);
char* combined = malloc(strlen(append)+strlen(p)+1);
strcpy(combined,append);
strcat(combined,p);
printf("%s\n",combined);
return(combined);
}
// use fixed size buffer, fgets
char*
getstuff() {
char line[666];
fgets(line, sizeof(line)-1, stdin);
if( NULL == checkin(line) ) return NULL;
char* combined = wrap(line);
return combined;
}
// use fixed size buffer, dynamic scanf
char*
getstuff2() {
char line[666];
// dynamically build scanf fmt to specify input width
char scanfmt[32];
sprintf(scanfmt,"%%%lds",sizeof(line));
scanf(scanfmt,line);
char* combined = wrap(line);
return(combined);
}
// use dynamic scanf read
char*
getstuff3() {
/* does your compiler support '%as' flag?
// use scanf to automagically malloc enough space
char *aline = NULL;
scanf("%as",&aline);
char* combined = wrap(aline);
free(aline);
return(combined);
*/
return(NULL);
}
int
main() {
char* stuff = getstuff();
if( NULL != stuff ) printf("got:%s\n",stuff);
free(stuff); stuff = NULL;
char* stuff2 = getstuff2();
if( NULL != stuff2 ) printf("got:%s\n",stuff2);
free(stuff2); stuff2 = NULL;
char* stuff3 = getstuff3();
if( NULL != stuff3 ) printf("got:%s\n",stuff3);
free(stuff3); stuff3 = NULL;
}
給貓剝皮的方法有很多種,我更喜歡#37,瘋狂膠水和牙刷!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.