C - opendir () return & ldquo; Нет такого файла или каталога & rdquo; [Дубликат]

Вот некоторые подходы к работе с асинхронными запросами:
  1. Объект обезьяны браузера
  2. Q - A
  3. A + Promises.js
  4. jQuery отложен
  5. API XMLHttpRequest
  6. Использование концепции обратного вызова - как реализация в первом ответе

Пример: jQuery отложенная реализация для работы с несколькими запросами

var App = App || {};

App = {
    getDataFromServer: function(){

      var self = this,
                 deferred = $.Deferred(),
                 requests = [];

      requests.push($.getJSON('request/ajax/url/1'));
      requests.push($.getJSON('request/ajax/url/2'));

      $.when.apply(jQuery, requests).done(function(xhrResponse) {
        return deferred.resolve(xhrResponse.result);
      });
      return deferred;
    },

    init: function(){

        this.getDataFromServer().done(_.bind(function(resp1, resp2) {

           // Do the operations which you wanted to do when you
           // get a response from Ajax, for example, log response.
        }, this));
    }
};
App.init();
163
задан Jonathan Leffler 14 March 2015 в 07:23
поделиться

12 ответов

Немного уродливый способ:

char *pos;
if ((pos=strchr(Name, '\n')) != NULL)
    *pos = '\0';
else
    /* input too long for buffer, flag error */

Немного странный способ:

strtok(Name, "\n");

Обратите внимание, что функция strtok не работает должным образом, если пользователь входит пустую строку (т.е. нажмите только Enter). Он оставляет неизменным \n.

Конечно, есть и другие.

113
ответ дан Malcolm McLean 25 August 2018 в 08:19
поделиться

Прямо удалить «\n» из вывода fgets, если каждая строка имеет «\n»

line[strlen(line) - 1] = '\0';

В противном случае:

void remove_newline_ch(char *line)
{
    int new_line = strlen(line) -1;
    if (line[new_line] == '\n')
        line[new_line] = '\0';
}
5
ответ дан Amitabha 25 August 2018 в 08:19
поделиться

Попробуйте следующее:

        int remove_cr_lf(char *str)
        {
          int len =0;


          len = strlen(str);

          for(int i=0;i<5;i++)
          {
            if (len>0)
            if (str[len-1] == '\n')
            {
              str[len-1] = 0;
              len--;
            }

            if (len>0)
            if (str[len-1] == '\r')
            {
              str[len-1] = 0;
              len--;
            }
          }

          return 0;
        }
0
ответ дан Balazs Kiss 25 August 2018 в 08:19
поделиться

Ниже приведен быстрый подход к удалению потенциала '\n' из строки, сохраненной в fgets(). Он использует strlen() с двумя тестами.

char buffer[100];
if (fgets(buffer, sizeof buffer, stdin) != NULL) {

  size_t len = strlen(buffer);
  if (len > 0 && buffer[len-1] == '\n') {
    buffer[--len] = '\0';
  }

Теперь используйте buffer и len по мере необходимости.

Этот метод имеет побочное преимущество len значение для последующего кода. Это может быть быстрее, чем strchr(Name, '\n'). Ref YMMV, но оба метода работают.


buffer, из оригинала fgets() не будет содержать в "\n" при некоторых обстоятельствах: A) Линия был слишком длинным для buffer, поэтому только char, предшествующий '\n', сохраняется в buffer. В потоке остаются непрочитанные символы. B) Последняя строка в файле не заканчивалась символом '\n'.

Если на входе есть встроенные нулевые символы '\0' в нем где-то, длина, сообщенная strlen(), не будет содержать местоположение '\n'.


Некоторые другие ответы ' Проблемы:

  1. strtok(buffer, "\n"); не удаляет '\n', когда buffer - "\n". Из этого ответа - изменен после этого ответа, чтобы предупредить об этом ограничении.
  2. Следующие ошибки приводятся в редких случаях, когда первый char, прочитанный fgets(), является '\0'. Это происходит, когда ввод начинается со встроенного '\0'. Тогда buffer[len -1] становится buffer[SIZE_MAX] доступным к памяти, конечно, вне допустимого диапазона buffer. Что-то хакер может попытаться найти в глупости чтения текстовых файлов UTF16. Это было состояние ответа , когда этот ответ был написан. Позже не-OP отредактировал его, чтобы включить код, подобный проверке этого ответа на "".
    size_t len = strlen(buffer);
    if (buffer[len - 1] == '\n') {  // FAILS when len == 0
      buffer[len -1] = '\0';
    }
    
  3. sprintf(buffer,"%s",buffer); - неопределенное поведение: Ref . Кроме того, он не сохраняет никаких ведущих, разделяющих или завершающих пробелов. Теперь удален .
  4. [Редактировать из-за хорошего ответа ] Нет проблем с 1 лайнером buffer[strcspn(buffer, "\n")] = 0;, отличным от производительности, по сравнению с strlen(). Производительность при обрезке обычно не является проблемой, поскольку код вводит I / O - черную дыру процессорного времени. Если следующий код нуждается в длине строки или имеет высокую производительность, используйте этот подход strlen(). Иначе strcspn() является прекрасной альтернативой.
15
ответ дан chux 25 August 2018 в 08:19
поделиться
char name[1024];
unsigned int len;

printf("Enter your name: ");
fflush(stdout);
if (fgets(name, sizeof(name), stdin) == NULL) {
    fprintf(stderr, "error reading name\n");
    exit(1);
}
len = strlen(name);
if (name[len - 1] == '\n')
    name[len - 1] = '\0';
0
ответ дан draebek 25 August 2018 в 08:19
поделиться

Нижеприведенная функция является частью библиотеки обработки строк, которую я поддерживаю в Github. Он удаляет и нежелательные символы из строки, что вы хотите

int zstring_search_chr(const char *token,char s){
    if (!token || s=='\0')
        return 0;

    for (;*token; token++)
        if (*token == s)
            return 1;

    return 0;
}

char *zstring_remove_chr(char *str,const char *bad) {
    char *src = str , *dst = str;
    while(*src)
        if(zstring_search_chr(bad,*src))
            src++;
        else
            *dst++ = *src++;  /* assign first, then incement */

    *dst='\0';
        return str;
}

Пример использования может быть

Example Usage
      char s[]="this is a trial string to test the function.";
      char const *d=" .";
      printf("%s\n",zstring_remove_chr(s,d));

  Example Output
      thisisatrialstringtotestthefunction

Вы можете проверить другие доступные функции или даже внести свой вклад к проекту :) https://github.com/fnoyanisi/zString

0
ответ дан Fehmi Noyan ISI 25 August 2018 в 08:19
поделиться
 for(int i = 0; i < strlen(Name); i++ )
{
    if(Name[i] == '\n') Name[i] = '\0';
}

Вы должны попробовать. Этот код в основном проходит через строку до тех пор, пока не найдет «\n». Когда он будет найден, '\n' будет заменен на нулевой символ terminator '\ 0'

Обратите внимание, что вы сравниваете символы, а не строки в этой строке, тогда нет необходимости использовать strcmp ():

if(Name[i] == '\n') Name[i] = '\0';

, поскольку вы будете использовать одинарные кавычки, а не двойные кавычки. Здесь ссылка о одиночных или двойных кавычках, если вы хотите узнать больше

1
ответ дан Matheus Martins Jerônimo 25 August 2018 в 08:19
поделиться

Для одиночного '\n' trmming,

void remove_new_line(char* string)
{
  size_t length;
  if( (length =strlen(string) ) >0)
  {
       if(string[length-1] == '\n')
                string[length-1] ='\0';
  }
}

для множественной обрезки '\n',

void remove_new_line(char* string)
{
  size_t length = strlen(string);
  while(length>0)
  {
       if(string[length-1] == '\n')
       {
                --length;
                string[length] ='\0';
       }
       else
           break;
  }

}
1
ответ дан Naveen Kumar 25 August 2018 в 08:19
поделиться
size_t ln = strlen(name) - 1;
if (*name && name[ln] == '\n') 
    name[ln] = '\0';
77
ответ дан P.P. 25 August 2018 в 08:19
поделиться

Тим Čas один лайнер поражает строки, полученные вызовом fgets, потому что вы знаете, что они содержат одну новую строку в конце.

Если вы находитесь в другом контексте и хотите обрабатывать строки, которые могут содержать более одной новой строки, вы можете искать strrspn. Это не POSIX, то есть вы не найдете его во всех Unices. Я написал один для своих собственных нужд.

/* Returns the length of the segment leading to the last 
   characters of s in accept. */
size_t strrspn (const char *s, const char *accept)
{
  const char *ch;
  size_t len = strlen(s);

more: 
  if (len > 0) {
    for (ch = accept ; *ch != 0 ; ch++) {
      if (s[len - 1] == *ch) {
        len--;
        goto more;
      }
    }
  }
  return len;
}

Для тех, кто ищет эквивалент Perl chomp в C, я думаю, что это он (chomp только удаляет конечную новую строку).

line[strrspn(string, "\r\n")] = 0;

Функция strrcspn:

/* Returns the length of the segment leading to the last 
   character of reject in s. */
size_t strrcspn (const char *s, const char *reject)
{
  const char *ch;
  size_t len = strlen(s);
  size_t origlen = len;

  while (len > 0) {
    for (ch = reject ; *ch != 0 ; ch++) {
      if (s[len - 1] == *ch) {
        return len;
      }
    }
    len--;
  }
  return origlen;
}
0
ответ дан Philippe A. 25 August 2018 в 08:19
поделиться

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

#include<stdio.h>
#include<stdlib.h>
int main(){
char *fname,*lname;
size_t size=32,nchar; // Max size of strings and number of characters read
fname=malloc(size*sizeof *fname);
lname=malloc(size*sizeof *lname);
if(NULL == fname || NULL == lname){
 printf("Error in memory allocation.");
 exit(1);
}
printf("Enter first name ");
nchar=getline(&fname,&size,stdin);
if(nchar == -1){ // getline return -1 on failure to read a line.
 printf("Line couldn't be read.."); 
 // This if block could be repeated for next getline too
 exit(1);
}
printf("Number of characters read :%zu\n",nchar);
fname[nchar-1]='\0';
printf("Enter last name ");
nchar=getline(&lname,&size,stdin);
printf("Number of characters read :%zu\n",nchar);
lname[nchar-1]='\0';
printf("Name entered %s %s\n",fname,lname);
return 0;
}

Примечание: [проблемы безопасности] с getline не следует пренебрегать.

0
ответ дан sjsam 25 August 2018 в 08:19
поделиться

Возможно, самое простое решение использует одну из моих любимых малоизвестных функций, strcspn() :

buffer[strcspn(buffer, "\n")] = 0;

Если вы хотите, чтобы она также обрабатывала '\r' (скажем, , если поток двоичный):

buffer[strcspn(buffer, "\r\n")] = 0; // works for LF, CR, CRLF, LFCR, ...

Функция подсчитывает количество символов до тех пор, пока оно не достигнет '\r' или '\n' (другими словами, он найдет первый '\r' или '\n'). Если он ничего не ударил, он останавливается на '\0' (возвращает длину строки).

Обратите внимание, что это отлично работает, даже если нет новой строки, поскольку strcspn останавливается на '\0'. В этом случае вся строка просто заменяет '\0' на '\0'.

300
ответ дан Tim Čas 25 August 2018 в 08:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: