【问题标题】:Function that stores string including tabs,spaces and new lines in C在 C 中存储包括制表符、空格和换行符在内的字符串的函数
【发布时间】:2022-01-04 13:10:49
【问题描述】:

我想存储一个最多 n 个字符的字符串,包括制表符、空格和换行符,但我不明白如何仅在字符串末尾获取此 '\0' 字符。

void takeString(char *c,int n)
{
    int i=0;
    char *result = fgets(c,n,stdin);
    if(result)
    {
        while(c[i] != '\0')
            i++;
        if(c[i]=='\0')
            c[i] = ' ';
    }
    c[n] = '\0';
}

【问题讨论】:

  • fgets 已经存储了一个字符串,直到换行符为止,包括任何制表符和空格以及尾随的换行符。您无需执行任何操作。
  • @KamilCuk 但是,当我说想要存储像这样的字符串“e[enter]d”,其中包含新行fgets() 不会让我这样做,因为它会停止工作.
  • @varkus 和"e[enter]d",用户应该如何表示输入结束? d 表示输入完成后会发生什么?
  • @chux-ReinstateMonica 我想让它像下一行没有任何字符并且用户输入新行然后函数将停止。
  • "然后函数将停止。" 不清楚。该函数已经停止并返回所有输入。这里没有无限循环。

标签: arrays c string function storage


【解决方案1】:

但我不明白如何仅在字符串末尾获取此 '\0' 字符。

if(c[i]=='\0') c[i] = ' '; 导致 c[] 不再是 字符串,因为它缺少 空字符。

c[n] = '\0'; 有 2 个问题。它不会再次使 c[] 成为字符串,因为它没有在 ' ' 之后设置字符,并且 2) 它可能会在指向我的 c 的数组指针之外设置一个字符,从而导致 未定义的行为 (UB)。

相反,在c[i] = ' ' 之后,将下一个字符设置为'\0'。

目前尚不清楚 OP 为什么要附加空格字符。

void takeString(char *c, int n) {
    int i=0;
    //char *result = fgets(c,n,stdin);
    char *result = fgets(c,n-1,stdin); // Leave room to append a ' '
    if(result) {
        while(c[i] != '\0') {
            i++;
        } 
        //if(c[i]=='\0')
        c[i++] = ' ';
        c[i] = '\0';
    }
    // c[n] = '\0';
}

【讨论】:

  • 我想我不清楚我的意图是什么。基本上我想用新行存储一个最多 n 的字符串。假设用户输入像这样"Abc[enter]defg" 和 n 是 6。所以我的函数应该插入数组的前 5 个字符,包括 [enter] 并忽略其余的输入。
  • @varkus 这就是fgets() 所做的。输入"Abc[enter]defg",'A'、'b'、'c'、'\n'和附加的'\0'这4个字符将被保存在c[]中。 "defg" 现在将被忽略并保留在 stdin 中以用于下一个输入功能。 fgets() 怎么没有达到你的目标?
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2012-07-12
  • 2015-07-06
  • 2020-09-01
相关资源
最近更新 更多