【问题标题】:C program wont recognize space characterC程序无法识别空格字符
【发布时间】:2019-09-26 04:32:54
【问题描述】:

我在 C 语言中有一个作业问题,即接受用户输入的字符(仅来自 a-z 或空格)并返回 ASCII 值。如果只有字符,代码可以正常工作,但是当我尝试输入空格时,它不会返回数字 32。任何帮助都会很棒!

#include <stdio.h>

char buf[128];

int main(int argc, char *argv[]) {
    buf[127] = 0;
    char *line = argv[1];
    int i;
    int j;
    i = 0;
    j = 126;
    while((line[i] >= 'a' && line[i] <= 'z') || (line[i] == ' ')){
        buf[j] = line[i];
        printf("%d", buf[j]);
        printf(" ");
        i++;
        j--;
    }
    return 0;   
}

没有错误消息。例如,如果我输入字符串“hello”,它会返回“104 101 108 108 111”,但如果我输入“hello guy”,它也会返回“104 101 108 108 111”并停在空格字符处。

【问题讨论】:

  • 您的程序只使用命令行参数而不是来自stdin - 这是故意的吗?
  • 你的程序对我有用 - 除了 shell 不会将单个空格传递给程序,它必须被引用 - 像这样:./program " "
  • @Dai 是的,这是故意的,不幸的是我必须在这个程序中使用命令行参数。
  • @aragaer 说得通。谢谢
  • 关于:char *line = argv[1]; 在访问argv[0] 以外的任何内容之前,请始终检查argc,以确保操作员实际输入了预期的命令行参数。此外,当命令行包含空格时,您的程序会将其视为两个命令行参数(除非您将整个参数包装在“...”中)

标签: c linux ascii


【解决方案1】:

它不起作用,因为您的程序仅使用命令行参数(而不是从 stdin 读取,这是大多数 C 作业所期望的),并且大多数 shell 将用空格分隔命令行参数,除非它们用引号引起来.

所以这个:

.\myprogram foo bar

将呈现为:

argc == 3
argv[0] == "(path)/myprogram"
argv[1] == "foo"
argv[2] == "bar"

但是这个:

.\myprogram "foo bar"

将呈现为:

argc == 2
argv[0] == "(path)/myprogram"
argv[1] == "foo bar"

【讨论】:

  • 这是有道理的。如果输入包含引号,我明天将与我的老师澄清。谢谢!
  • @DylanT 如果输入将包含引号,您的 shell 将有一种转义它们的方法,以便它们对程序可见,例如,bash 使用反斜杠,例如 myprogram "foo\" bar"
【解决方案2】:

就空间而言,您的代码没有任何问题。但是,您正在使用的命令行解释器(Windows 上的cmd32.exe?Linux 上的bash?)将空格视为参数终止:如果您编写

yourprogram hello world

“你好”转到argv[1],但“世界”转到argv[2]...,而空格则无处可去。 试试

yourprogram "hello world"

使用引号告诉解释器将整个字符串“hello world”视为单个参数。

您的代码还有其他内容: 您正在填写 buf 而不用它做任何事情。你也是从后面填的,这是什么原因?

【讨论】:

  • 家庭作业让我从后面填充缓冲区并向后打印(我最好的猜测是这是为了练习,我不知道他为什么会让我们这样做)。是的,这是有道理的,当我使用正确打印的引号时。谢谢!
  • 您不是向后打印,而是向后填充 buf,而是在阅读时打印,即向前。
  • 好吧,我的错。作为此分配的一部分,我们只是应该向后填充缓冲区。我不太清楚为什么这是一项要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2014-10-12
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多