【问题标题】:in C the correct way to test nth character == "x" in a string passed to a function在C中测试传递给函数的字符串中第n个字符==“x”的正确方法
【发布时间】:2017-01-18 14:36:03
【问题描述】:

鉴于以下情况,我遇到了分段错误,我不确定是不是因为我正在针对指针或其他问题进行测试。

测试第 4 个字符是否为逗号的正确方法是什么?

从fifo abc,def,xyz读取字符串

char in[BUFFER] = {'\0'};
if ((in_fl = open(*fifofile, O_RDONLY)) == -1)
    {
     while (read(in_fl, in, BUFFER)>0) {
      doParseInput(&in);
    }


void *doParseInput(char *inputread){
//copy string to use later....
 char* theParsedString = calloc(strlen(inputread)+1, sizeof(char));
 strcpy(theParsedString , inputread);
 if (strcmp(theParsedString[3], ",") == 0){ //causes seg fault

我也试过直接用传过来的字符串,也是seg fault

if (strcmp(inputread[3], ",") == 0){ //causes seg fault

【问题讨论】:

  • if (inputread[3] == ',') { 是您比较 char 的方式。 strcmp() 用于比较字符串(以空字节结尾的字符序列)。
  • 查看相关question。不是真正的重复,因为您要求的是 C 解决方案,但接受的答案也是 C。
  • 确保您对in(您的缓冲区)进行了足够的阅读:如果您只阅读了 3 个字符,则无法测试第 4 个字符。然后,使用不带 & 符号的 doParseInput(in)。然后,比较像inputread[3] == ','
  • 什么样的蹩脚编译器让这段代码编译?

标签: c strcmp


【解决方案1】:

要将缓冲区传递给函数,请不要使用&
而是:

doParseInput(in);

比较缓冲区的第 4 个字符(索引 == 3):

if (theParsedString[3] == ','){ 

(注意单引号,意思是Character-Value,而不是双引号,意思是"String"

【讨论】:

  • 您能否扩展或指向一些关于“为什么”不使用 & 传递缓冲区的文档。使用& 和没有作品,我有兴趣了解不使用它背后的良好做法,谢谢艺术
【解决方案2】:

首先,您将错误类型的参数传递给doParseInput。它需要char *,但您传递给它的是char (*)[]。你的编译器应该已经警告你了。

另一个问题是您使用字符串比较来检查单个字符。您需要使用字符常量(即使用单引号而不是双引号)并将其与数组成员直接进行比较。

if (theParsedString[3] == ',') {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多