为什么在 C 中没有检测到定界符 \n?
Why isn't the delimeter \n being detected in C?
问题是在我遍历数组时检测到“\n”。它曾经作为
显示在评论中,但之后不起作用。该程序的目标是从终端获取输入并将其放入数组中。该数组不应包含任何“\n”。感谢任何帮助,谢谢
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 1. Function must take input and place in array whilst making sure it does not overflow
// 2. Must return null if end of stdi is reached
// 3. Must ensure that it does not contain delimeter \n
// Tests:
// a) empty string
// b) string longer than buffer
// c) what happens when you press ctrl-d
char read_line(char *buf, size_t sz) {
while(fgets(buf + strlen(buf), sz, stdin)){
if (strlen(buf) < sz) {
if(buf[strlen(buf)-1] == '\n' ){
// IT GET'S DETECTED HERE WHEN THE ENTER
// BUTTON
// IS PRESSED BUT ...
break;
}
}
}
// WHEN I LOOP THROUGH THE ARRAY IT GETS DETECTED AS SINGLE CHARS; '\'
// AND 'n' DISTINCTLY
for(int i = 0; i < strlen(buf)-1; ++i){
if(buf[i] == '\n'){
printf("present");
} else {
printf("x");
}
}
return NULL;
}
int main(int argc, char *argv[]){
char arra[20];
size_t sz = sizeof(arra);
memset(arra, 0, sz);
printf("Enter command: \n");
read_line(arra, sz);
// Print elements in array
printf("Printing out array: \n");
for(int i = 0; i < strlen(arra); ++i){
char c = arra[i];
printf("%c", c);
}
}
您似乎正在输入类似于击键的内容 hello\nENTER.
distinct两个字符\
和n
的条目恰好即,两个不同的字符.这与在源代码中表示为 \n
.
的单个换行符有很大不同
就缓冲区将容纳的内容而言,它将是字符串 "hello\n\n"
,其中 \
是 \
字符,n
是 n
,\n
是换行符。
如果您的目的是检测字符串中的换行符,则需要处理字符串中的每个 个字符。循环:
for (int i = 0; i < strlen(buf) - 1; ++i) ...
基本上会跳过最后一个字符,这对于忽略尾随的换行符(如果它存在的话)很好,但是,如果你想检测它,你需要:
for (int i = 0; i < strlen(buf); ++i) ...
建议更换:
for(int i = 0; i < strlen(buf)-1; ++i){
if(buf[i] == '\n'){
printf("present");
} else {
printf("x");
}
与:
if( strchr( buf, '\n' ) )
{
puts( "present" );
}
else
{
puts( "x" );
}
问题是在我遍历数组时检测到“\n”。它曾经作为 显示在评论中,但之后不起作用。该程序的目标是从终端获取输入并将其放入数组中。该数组不应包含任何“\n”。感谢任何帮助,谢谢
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 1. Function must take input and place in array whilst making sure it does not overflow
// 2. Must return null if end of stdi is reached
// 3. Must ensure that it does not contain delimeter \n
// Tests:
// a) empty string
// b) string longer than buffer
// c) what happens when you press ctrl-d
char read_line(char *buf, size_t sz) {
while(fgets(buf + strlen(buf), sz, stdin)){
if (strlen(buf) < sz) {
if(buf[strlen(buf)-1] == '\n' ){
// IT GET'S DETECTED HERE WHEN THE ENTER
// BUTTON
// IS PRESSED BUT ...
break;
}
}
}
// WHEN I LOOP THROUGH THE ARRAY IT GETS DETECTED AS SINGLE CHARS; '\'
// AND 'n' DISTINCTLY
for(int i = 0; i < strlen(buf)-1; ++i){
if(buf[i] == '\n'){
printf("present");
} else {
printf("x");
}
}
return NULL;
}
int main(int argc, char *argv[]){
char arra[20];
size_t sz = sizeof(arra);
memset(arra, 0, sz);
printf("Enter command: \n");
read_line(arra, sz);
// Print elements in array
printf("Printing out array: \n");
for(int i = 0; i < strlen(arra); ++i){
char c = arra[i];
printf("%c", c);
}
}
您似乎正在输入类似于击键的内容 hello\nENTER.
distinct两个字符\
和n
的条目恰好即,两个不同的字符.这与在源代码中表示为 \n
.
就缓冲区将容纳的内容而言,它将是字符串 "hello\n\n"
,其中 \
是 \
字符,n
是 n
,\n
是换行符。
如果您的目的是检测字符串中的换行符,则需要处理字符串中的每个 个字符。循环:
for (int i = 0; i < strlen(buf) - 1; ++i) ...
基本上会跳过最后一个字符,这对于忽略尾随的换行符(如果它存在的话)很好,但是,如果你想检测它,你需要:
for (int i = 0; i < strlen(buf); ++i) ...
建议更换:
for(int i = 0; i < strlen(buf)-1; ++i){
if(buf[i] == '\n'){
printf("present");
} else {
printf("x");
}
与:
if( strchr( buf, '\n' ) )
{
puts( "present" );
}
else
{
puts( "x" );
}