簡體   English   中英

非法指令 4:(

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM