【问题标题】:strings in c automatically concatenatesc中的字符串自动连接
【发布时间】:2014-04-04 11:00:20
【问题描述】:
struct flight_list{
    char fcode[4];
    string20 srccity;
    string20 descity;
    int deptime;
    int duration;

};   

 void add_flight(string20 city[], struct flight_list flight_arr[]){
        int i,j;
        int check;
        char flight[MAX];
        string20 src;
        string20 choice;
        system("cls");
        do{
        while(strcmp(flight_arr[i].fcode,"")!=0)
        i++;
        do{
        check = 0;
        printf("flight code: ");
        scanf("%s",flight);
        flight[4] = '\0';
        strcpy(flight_arr[i].fcode,flight);

        for(j=0;j<i;j++){
            if(strcmp(flight_arr[j].fcode,flight_arr[i].fcode)==0){
                printf("not unique\n");
                getch();
                system("cls");  
                check = 1;  
            }

        }

        }while(check == 1);
        printf("source city: ");
        scanf("%s",src);
        strcpy(flight_arr[i].srccity,src);
        printf("%s",flight_arr[i].fcode);


        }while(strcmp(flight,"no")!=0);
    }

flight_arr[].fcode 与 srccity 连接我不知道为什么结构数组的所有值在转到此函数之前都已初始化,并且在此函数中没有其他函数用于连接任何字符串请帮助!

【问题讨论】:

  • 什么是string20MAX 是什么?
  • 顺便说一句,您的代码中有undefined behavior:请记住,局部变量未初始化,未初始化使用它们会导致未定义的行为。你永远不会初始化索引变量i
  • 感谢@JoachimPileborg 解决了我的问题,非常感谢!

标签: c arrays string struct linked-list


【解决方案1】:
struct flight_list{
    char fcode[4];

        scanf("%s",flight);
        flight[4] = '\0';
        strcpy(flight_arr[i].fcode,flight);

不! flight_arr[i].fcode 有 4 个字符的空间; flight[4] 是第五个字符。

【讨论】:

  • 它必须只有 4 个字符 :) 这就是为什么我将 null 放在第 5 个字符上,这并不能解决任何问题,抱歉
  • 问题是“ABCD”不适合flight_arr[i].fcode。您需要为字符串终止符留出空间。
  • @PNC 这是四个字符加上终止符,所以你的数组必须是五个字符大。如果它们只包含四个字符的空格,而你写到第五个字符,那么第五个字符会在哪里结束?
【解决方案2】:

我想你不明白 PMG 的回答。他是对的。如果您将其声明为char fcode[4];,您将无法访问flight[4],因为它只有从0 到3 的位置。没有第5 个位置。实际上,您正在滑向与您的意思不同的记忆。在 C 中,字符串应该被声明为包含的字符串的大小+1(NULL)。因此,如果我想创建一个包含“Hello”的字符串(Hello 本身是 5 个字母),我会这样声明:

char mystr[] = "Hello";

那么大小将由输入的文字字符串决定——它是六而不是五,因为它需要另一个空间来存放 NULL。 顺便说一句 - scanf("%s") 会自动以 NULL 结束字符串输入 - 正如 gets 所做的那样 - 但我会推荐 fgets() 以这种方式使用 fgets(StringInput, StringSize, stdin); 和在你的情况下使用 fgets(flight, 4, stdin); 就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多