Печать argv[i] в output посимвольно

Дима_Кирсанов

Пытаюсь напечатать элемент argv[i] посимвольно. Компилятор выдает ошибку: error C2440: '=' : cannot convert from 'char *' to 'char [255]'. Поясните, пжл, в чем ошибка. И почему нельзя преобразовать строку в строку, и в чем разница между char[255] и char. Что лучше почитать новичку, чтобы научиться разбираться в этом самому?
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
 
int main(int argc, char* argv[])
{
    char str[255];
    
    for (int i = 1; i < argc; i++)
    {
        int len;
        len = strlen(argv[i]);
        str = argv[i];
        for(int j = 0; j <= len; i++)
          printf("%c\n", str[j]);
    }
    return 0;
}
8 ответов

Дима_Кирсанов

Нужно почитать о строках в стиле СИ и об аргументах функции main(): argv и argc. Варианты, близкие к Вашему: 1)
#include <cstdio>
#include <cstring>
 
int main( int argc, char* argv[] ) {
    char str[ 255 ];
 
    // если argc меньше двух, то значит есть только argv[ 0 ], который содержит имя программы
    if ( argc < 2 ){ // можно выдавать сообщение о том, что пользователь не ввёл достаточное количество аргументов
        perror( "Мало аргументов" );
    }
 
    // цикл с 1, чтобы не выводить имя программы в argv[ 0 ]
    for ( int i = 1; i < argc; ++i ) {
 
        strcpy( str, argv[ i ] ); // копирование строки не через присваивание
 
        for ( size_t j = 0; j < strlen( str ); ++j ) // было  ++i :)
            printf( "%c", str[ j ] );
 
        printf( "\n" );
    }
    return 0;
}
Переменная str в данной задачи вообще лишняя, потому можно и без неё обойтись.2)
#include <cstdio>
#include <cstring>
 
int main( int argc, char* argv[] ) {
 
    // если argc меньше двух, то значит есть только argv[ 0 ], который содержит имя программы
    if ( argc < 2 ) { // можно выдавать сообщение о том, что пользователь не ввёл достаточное количество аргументов
        perror( "Мало аргументов" );
    }
 
    // цикл с 1, чтобы не выводить имя программы в argv[ 0 ]
    for ( int i = 1; i < argc; ++i ) {
        for ( size_t j = 0; j < strlen( argv[ i ] ); ++j ) // было  ++i :)
            printf( "%c", argv[ i ][ j ] );
 
        printf( "\n" );
    }
    return 0;
}


Дима_Кирсанов

ОК, я написал так:
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
#include <cstdio>
#include <cstring>
 
int main(int argc, _TCHAR* argv[])
{
  if (argc < 2)
    printf("Enter two arguments at least, please\n");
  else
  {
    for (int i = 1; i < argc; i++)
    {
      for(int j = 0; j <= strlen(argv[i]); i++)
        printf("%c\n", argv[i][j]);
    }
  {
  return 0;
}
Но теперь другой баг. Вот что сказал компилятор: error C2664: 'strlen' : cannot convert parameter 1 from '_TCHAR *' to 'const char *'.Кто-нибудь знает как исправить его?


Дима_Кирсанов

int main(int argc, _TCHAR* argv[])
int main(int argc, char **argv)
strcpy( str, argv[ i ] ); // копирование строки не через присваивание
char *str = argv[i] Это так, чтобы не забыть


Дима_Кирсанов

Так не пойдет.
int main(int argc, char **argv)
Тут смысл в том что должно быть так:
int main(int argc, _TCHAR* argv[])
А что это за тип такой: char **? В чем различие между char ** и char *?


Дима_Кирсанов

А что это за тип такой: char **? В чем различие между char ** и char *?
Дима_Кирсанов, на вход в main передается массив из параметров командной строки. Каждый элемент массива - строка, которая передается в виде указателя char * на ее первый элемент. Но т.к. у нас массив таких строк - появляется char **. Т.е. это указатель на начало массива, содержащего указатели на начало строк...
Тут смысл в том что должно быть так:
int main(int argc, _TCHAR* argv[])
Что за смысл вы в этом видите? Под _TCHAR скорее всего скрывается wchar_t, а под него нужно использовать совсем другие функции нежели strlen и printf.


Дима_Кирсанов

Под _TCHAR скорее всего скрывается wchar_t,
от настроек зависит _TCHAR это макрос введенный мелкомягкими для удобства портирования если в настройках проекта стоит использовать юникоде то _TCHAR приведется к wchar_t если не стоит то приведется к char в данном случае, скорее всего,достаточно войти в настройки проекта и убрать использование юникоде


Дима_Кирсанов

Что за смысл вы в этом видите?
Так учит преподаватель. Хотелось бы сделать без обходных путей, отталкиваться от того что есть. Вот такой смысл


Дима_Кирсанов

Так учит преподаватель.
если учит, то пускай учит до конца т.е и свои строки нужно объявлять не
char str[255];
а
TCHAR str[255]
не использовать функции
'strlen
а использовать универсальные _tcslen вот здесь расписано https://msdn.microsoft.com/ru-ru/library/78zh94ax.aspx