【问题标题】:Why isn't the delimeter \n being detected in C?为什么在 C 中没有检测到分隔符 \n?
【发布时间】:2017-11-10 00:05:01
【问题描述】:

当我遍历我的数组时,问题是检测到“\n”。它工作一次 在 cmets 中显示,但之后它不起作用。该程序的目标是从终端获取输入并将其放入数组中。该数组不应包含任何“\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);
        }
}

【问题讨论】:

  • 您是在终端中输入 \n 还是按回车键?
  • 我都做了。例如:
  • 您好 \n 随便什么 [然后我按回车键]
  • 等等,所以你输入了一个反斜杠,然后是字母 n,然后你惊讶地发现数组中有一个反斜杠,然后是字母 n?这不就是它应该做的吗?当然数组包含你输入的内容!
  • 不,它检测'\n'是否在数组中,如果它要打印它没有做的'present'!

标签: c arrays buffer stdin delimiter


【解决方案1】:

您似乎正在输入类似按键 hello kbd>\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) ...

【讨论】:

  • 这是最好的答案,我不知道 \\n 和 \n 之间的区别,谢谢。另外,我确实知道它不会包含尾随的新行。
  • @Neumann 好吧,我对你的问题一无所知,所以我不好
  • 没关系,非常感谢大家的帮助,意义重大
【解决方案2】:

建议更换:

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" );
}

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多