Я работаю над созданием функции верхнего регистра для практики. Я хочу реализовать аргументы 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
Какую ошибку вы получаете?
ошибка: неверный инициализатор
также я помещаю вкладку codeblocks argumets некоторые строки
Дело 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, как тогда сохранить в переменной?
Есть ли другой способ без использования cmd arg? Мне нужно работать с argv, потому что у меня есть аргументы настройки в наборе строк на вкладке, мне нужно использовать argv и переходить в верхний регистр один за другим!
вы должны использовать указатель 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
съедать память позже.
uppercase(argv(1));
не работает и не соответствует тому, что есть в вашем коде.