Создайте строку с каждым аргументом командной строки - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь сделать (в C) строку, которая будет содержать каждый аргумент командной строки, с пробелами между ними. Я написал следующее:

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

int main(int argc, char * argv[]){
    char * str = malloc(3 * sizeof(char));
    * str = 'n';
    * (str + 1) = '\0';
    if (argc != 1){
        int istr = 0;
        int iarg = 0;
        for (int i = 1; i < argc; i++){
            str = realloc(str, sizeof(char) * (strlen(str) + strlen(argv[i]) + 1));
            while (iarg < strlen(argv[i])){
                str[istr] = argv[i][iarg];
                istr++;
                iarg++;
            }
            istr++;
            str[istr] = ' ';
            iarg = 0;
        }
    }
    return 0;
}

Но это не работает, и добавление отпечатков не помогает мне понять, почему. Вы видите проблему (ы)?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Heyho

Вдохновленный вашей идеей, вот версия, которую я написал.

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

int main(int argc, char * argv[])
{
    printf("Hello world!\n");

    if (argc <= 1) return 1; // exit if no args

    printf("arguments detected\n");

    size_t size = 2; // start with size 2 for \n (newline) and \0 (terminator)

    for(int i = 0; i < argc; i++){
        size += strlen(argv[i]) + 1;
        //some debug output for understanding
        printf("\t%s is %i\n", argv[i], strlen(argv[i]));
    }
    //getting the size

    printf("All arguments added are %i long\n", size);

    char * final_str = malloc(size); //malloc new string
    int offset = 0;
    for(int i = 0; i < argc; i++){ // for all args
        int len = strlen(argv[i]); // get length of string
        memcpy(&final_str[offset], argv[i], len); // copy arg into finalstring at offset
        offset +=len + 1; // increment offset by length of string and 1 bnus for space
        final_str[offset-1] = ' '; // add space
    }
    final_str[size-2] = '\n'; //add the last 2 elements
    final_str[size-1] = '\0';
    //print
    printf("%s", final_str);

    return 0;
}

Надеюсь, это поможет.

PS: Просьба не использовать * (str + 1) = ...; используйте str [1] = ...; это легче понять

0 голосов
/ 02 апреля 2020

Проблема в том, что выделенная память кажется обнуленной (или, по крайней мере, имеющей ноль после скопированной строки), и вы помещаете свой ' ' после строки, заканчивающейся '\0' таким образом. Поэтому строка заканчивается после первого аргумента, и при печати она будет показывать только первый аргумент, а также strlen будет возвращать количество символов до этого '\0'. Измените это

istr++;              // skipping the terminating '\0'
str[istr] = ' ';     // writing ' ' after it

на

str[istr++] = ' ';   // overwriting the terminating '\0' by ' '
str[istr] = '\0';    // terminating the string

Также измените это

(strlen(str) + strlen(argv[i]) + 1)

на

(strlen(str) + strlen(argv[i]) + 2)

Так что места достаточно для ' ' и окончание '\0'.

...