ожидайте, что символ аргумента в C с gcc

#c #gcc #char #scanf

Вопрос:

привет, у меня есть этот скрипт на C, который я компилирую с gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

но вернемся

 warning: format ‘%[0-9 ’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[1]’ [-Wformat=]
  92 |     sscanf(resultato,"%[0-9 ]",amp;SecondPart);
     |                       ~~~~~^   ~~~~~~~~~~~
     |                            |   |
     |                            |   char (*)[1]
     |                            char *
 

или когда не возвращается ошибка (потому что я изменяю сценарий), ничего не возвращаю
сценарий

 RING_FUNC(ring_binapiceckservertime)
{
    char Address[100] = {0};
    const char *UrlSpec = "/time";
    char *FirstPart[30] = {0};
    char SecondPart[] = "";
    size_t sz = strlen(cmDOriG)    strlen(UrlApi)  strlen(UrlApiV3)   strlen(UrlSpec)    1;
    char destination[sz];
    strcpy(destination, cmDOriG);
    strcat(destination, UrlApi);
    strcat(destination, UrlApiV3);
    strcat(destination, UrlSpec);
    //printf("%sn", destination);
    //int  status = system(destination);
    const char* mode = "r";
    FILE *cmd=popen(destination, mode);
    char result[50]={0x0};
    //while (fgets(result, sizeof(result), cmd) !=NULL)
    const char *resultato = fgets(result, sizeof(result), cmd);
         //  printf("%sn", resultato);
       
    sscanf(resultato,"%[0-9 ]",amp;SecondPart);
    pclose(cmd);
       // 
        printf("%sn", amp;SecondPart[13]);
          printf("value of b_static: %.*sn", (int)sizeof(SecondPart), SecondPart);
}
 

если я установлю

 printf("%sn", amp;SecondPart); or printf("%sn", SecondPart)```
not  give me  error but not return nothing 
 

Комментарии:

1. В принципе, вы пытаетесь сделать много полу-продвинутых вещей, прежде чем поймете основы массивов и строк в C. Я предполагаю, что вы пришли с другого языка программирования. Примечательно, что в C нет строкового класса, как в большинстве языков. Поэтому вам нужно изучить массивы, затем указатели, затем строки в таком порядке.

2. Спасибо за ответ Лундин , да , ваша интуиция верна, и я тоже изучаю C , но обучение для меня никогда не бывает таким линейным , как изучение указателя и массива, а после решения проблемы , на практике одно дело учиться и одно дело осознавать, что вы делаете, поэтому, прежде чем я здесь, еще раз спасибо за ваше время, пока

3. Обработка строк в C-очень распространенная ловушка для людей, работающих с языками более высокого уровня, такими как Java и т. Д. Большинство книг по программированию на языке Си структурированы линейно, так что вы изучите все предварительные условия, прежде чем двигаться дальше. Вы не можете понять указатели, прежде чем поймете массивы, и вы не можете понять строки, прежде чем поймете и массивы, и указатели.

Ответ №1:

строки в scanf семействе функций обрабатываются иначе, чем другие типы данных. Вам не нужно передавать указатель на них, так как они уже являются указателем. Так что все, что вам нужно, это

 sscanf(resultato,"%[0-9 ]",SecondPart);
 

Но! Это не сработает, потому что вторая часть недостаточно велика, чтобы вместить что-либо, кроме пустой строки, поскольку это все выделенное вами пространство.

Вам нужно указать его размер вот так…

 char SecondPart[100];
 

…но это делает предположение, что самая большая вводимая строка имеет длину 99 символов.

Лучший способ, поскольку вы можете изучить содержимое resultato , — это сначала вычислить длину строки, которая вам понадобится.

 char *SecondPart;
size_t length = strspn(resultato, "01234567890 ");
SecondPart = malloc(sizeof(char) * (length 1)); // Note sizeof(char) is pretty much guarenteed to be 1, but it makes the code clearer what you're allocating.
sscanf(resultato, "%[0-9 ]", SecondPart);
 

выделение памяти означает, что в какой-то момент позже вам, конечно, понадобится free память.

 free(SecondPart);
 

Комментарии:

1. большое спасибо Крисс за ваш очень исчерпывающий ответ , для такого новичка , как я, я вставляю символ второй части[100]; и sscanf(resultato,»%[0-9 ]»,вторая часть); но , к сожалению, ничего не возвращаю, я полагаю, вероятно, sscanf не нравится результат fgets?? если я напечатаю результат, у меня будет просто строка {отметка времени:12345678996326}, я полагаю , что 100 символов-это достаточные значения :D, но, вероятно, в этом sscanf есть что-то странное, еще раз спасибо за ваше время

2. @armanvanlendel сейчас, похоже, самое подходящее время для исследования с помощью отладчика, чтобы вы могли видеть, что делает ваш код, когда это происходит.

3. да, я полагаю, да ……. ……..как использовать отладчик ?? 😀

4. @armanvanlendel google должен быть в состоянии ответить на этот вопрос для вашей настройки сборки