#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 должен быть в состоянии ответить на этот вопрос для вашей настройки сборки