C: Как внедрить argv в переменную и реализовать цикл for?

Я работаю над созданием функции верхнего регистра для практики. Я хочу реализовать аргументы argc и argv с циклом for для проверки каждого входного значения в моем коде, но при таком использовании argv это не сработает:

char s[] = argv[0];

Но это работает:

верхний регистр (аргумент [1]);

Как я могу реализовать свои аргументы в переменной с помощью цикла for?

Вот мой код;

Основной.с:

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

#include "upperc.h"


int main(int argc, char *argv[])
{
    char s[] = argv[1]; // This is giving me a error.

    printf("%s \n", uppercase(argv[1])); // This is working

    return 0;
}

верхний.c:

/*
Parsing the string, then making the letters to uppercase.
*/

#include <stdio.h>
#include "upperc.h"

#define MAGIC_NUMBER 32 //6th bit ability of letter chars

char * uppercase(char *s) {
    for(char *p = s; *p; ++p) {
        if ('a' <= *p && *p <= 'z')
            *p = *p - MAGIC_NUMBER;
    }

    return s;
}

верхний.h:

#ifndef UPPERC_H_INCLUDED
#define UPPERC_H_INCLUDED

char * uppercase(char *s);

#endif // UPPERC_H_INCLUDED
uppercase(argv(1)); не работает и не соответствует тому, что есть в вашем коде.
Scott Hunter 11.12.2020 18:36

Какую ошибку вы получаете?

Scott Hunter 11.12.2020 18:37

ошибка: неверный инициализатор

Barak 11.12.2020 18:38

также я помещаю вкладку codeblocks argumets некоторые строки

Barak 11.12.2020 18:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
493
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Дело 1

char s[] = argv[0]; здесь s — массив, а argv[0] — указатель или адрес.

Вы не можете хранить некоторый указатель в массиве

Вместо этого используйте char *cmd_arg = argv[0];

Если вы хотите прочитать набор аргументов командной строки, используйте циклы для перебора набора входных данных командной строки.

//since argv[0] indicates program name , starting `a` from 1 instead of 0
for(int a = 1; a < argc; a++)
    uppercase(argv[a]);   

случай 2

uppercase(argv(1)); я думаю, вы имеете в виду uppercase(argv[1]);

Это нормально, потому что uppercase принимает указатель char*

ну да, строковый тип char, как тогда сохранить в переменной?

Barak 11.12.2020 18:45

Есть ли другой способ без использования cmd arg? Мне нужно работать с argv, потому что у меня есть аргументы настройки в наборе строк на вкладке, мне нужно использовать argv и переходить в верхний регистр один за другим!

Barak 11.12.2020 19:08

вы должны использовать указатель char вместо массива char:

char *s = argv[1];

См. это для справки: В чем разница между массивом символов и указателем на символ в C?

argv[1] не является массивом символов. Это указатель на массив символов. Итак, вам нужно назначить char следующим образом:

char *s = argv[1];

Кроме того, вы можете использовать malloc с memcpy из stdlib.h и strlen из string.h, чтобы скопировать argv[1] в s (рекомендуется, если вы хотите внести некоторые изменения с s позже):

size_t len = strlen(argv[1]))+1; // 1 for NULL byte
char *s = malloc(len);
memcpy(s, argv[1], len);

Преимущество второго подхода — возможность reallocсъедать память позже.

Другие вопросы по теме