【问题标题】:Checking for specific characters in a String检查字符串中的特定字符
【发布时间】:2016-02-13 21:12:34
【问题描述】:

我有一个如下所示的字符串:

char *string = "This is a\r string\r\nTTTT";

我想在哪里检查一个字符串(例如上面的 \r\r\n 字符,但是,简单地使用 strcmp 是行不通的。例如:

if (strcmp(string, "\r\n") == 0) {     
    if (strcmp(string, "\n) == 0) {
        printf("The string contains both a newline, and "\r\n" characters");
    }
}

memcmpstrncmp 似乎也不起作用:

if (memcmp(string, "\r\n", 2) == 0) {
    if (memcmp(string, "\n", 1) == 0) {
        printf("The string contains both a newline, and "\r\n" characters");
    }
}

我也试过这个(这有点工作,但后来没有)。

int i;
for (i = 0; i < strlen(string); i++) {
    if (string[i] == '\n') {
        if (strcmp(string, "\r\n") == 0) {
            printf("The string contains both a newline, and "\r\n" characters");
        }
    }
}

我尝试的最后一个方法确实找到了换行符,但找不到“\r\n”字符。上面的另外两个根本不起作用,有什么想法吗?

【问题讨论】:

  • 目前尚不清楚预期的行为应该是什么。找到\r\n 中的第一个?那将是 strpbrk()。 所有的出现?您想tokenize 输入字符串,使用这些字符作为分隔符吗?请更准确。无论哪种方式,请熟悉the string functions,那里有满足各种需求的东西。
  • 寻找一个字符串,其中“\r\n”不在行尾,并且还包含一个“\n”字符。
  • 因为在我的字符串中,“\r\n”不在行尾,并且不遵循“\r\n”字符位于末尾的 Windows 约定,而UNIX 的末尾有“\n”约定。基本上,这是一个字符串不遵循正确约定的错误情况。
  • 要检测“混合行尾”,您需要扫描\r 并检查它后面是否跟\n。如果是/不是,则继续扫描\r,直到找到一个不是/后跟\n
  • 在您的代码片段中,您没有正确转义"The string contains both a newline, and "\r\n" characters" 字符串中的"

标签: c string parsing


【解决方案1】:
#include <stdio.h>
#include <string.h>

int main(void) {
    char * someString = "This is a\r string\r\nTTTT";
    if(strstr(someString, "\r\n") != NULL) {
        puts("We hit \\r\\n");
    }

    if(strstr(someString, "\n") != NULL) {
        puts("We hit \\n");
    }

    return 0;
}

【讨论】:

  • 这只检查 "\r\n" 而不是另一个 "\n" ?我的意思是,我可能有一个字符串(给我)只有“\r\n”但没有换行符,所以你的 if 语句无论如何都会执行。
  • 您也可以使用相同的strstr 调用来检查\n,我添加了一个示例。您需要处理的任何逻辑都可以通过对这些比较语句进行排序来实现。
  • 奇怪,它似乎仍然没有返回true?不确定这是未定义的行为还是发生了其他事情。代码腐烂或其他东西。
  • 似乎第一个 if 语句失败了,"\r\n" 从来没有足够奇怪的发现。
  • @KEDE:这是一个不同的问题,如果不看代码我们就无法解决。请注意,fflush() 仅适用于 output 流。行尾处理还取决于您是以文本模式还是二进制模式打开文件,以及您正在使用的操作系统。
猜你喜欢
  • 2011-07-08
  • 2013-10-21
  • 2013-10-19
  • 2017-12-16
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多