Короткий ответ: вам нужно выполнить обратный вызов следующим образом:
function callback(response) {
// Here you can do what ever you want with the response object.
console.log(response);
}
$.ajax({
url: "...",
success: callback
});
Немного уродливый способ:
char *pos;
if ((pos=strchr(Name, '\n')) != NULL)
*pos = '\0';
else
/* input too long for buffer, flag error */
Немного странный способ:
strtok(Name, "\n");
Обратите внимание, что функция strtok
не работает должным образом, если пользователь входит пустую строку (т.е. нажмите только Enter). Он оставляет неизменным \n
.
Конечно, есть и другие.
Прямо удалить «\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';
}
Попробуйте следующее:
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;
}
Ниже приведен быстрый подход к удалению потенциала '\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'
.
Некоторые другие ответы ' Проблемы:
strtok(buffer, "\n");
не удаляет '\n'
, когда buffer
- "\n"
. Из этого ответа - изменен после этого ответа, чтобы предупредить об этом ограничении. 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';
}
sprintf(buffer,"%s",buffer);
- неопределенное поведение: Ref . Кроме того, он не сохраняет никаких ведущих, разделяющих или завершающих пробелов. Теперь удален . buffer[strcspn(buffer, "\n")] = 0;
, отличным от производительности, по сравнению с strlen()
. Производительность при обрезке обычно не является проблемой, поскольку код вводит I / O - черную дыру процессорного времени. Если следующий код нуждается в длине строки или имеет высокую производительность, используйте этот подход strlen()
. Иначе strcspn()
является прекрасной альтернативой. 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';
Нижеприведенная функция является частью библиотеки обработки строк, которую я поддерживаю в 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
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';
, поскольку вы будете использовать одинарные кавычки, а не двойные кавычки. Здесь ссылка о одиночных или двойных кавычках, если вы хотите узнать больше
Для одиночного '\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;
}
}
size_t ln = strlen(name) - 1;
if (*name && name[ln] == '\n')
name[ln] = '\0';
Тим Č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;
}
Если использование 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
не следует пренебрегать.
Возможно, самое простое решение использует одну из моих любимых малоизвестных функций, 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'
.