无法将单引号作为命令行参数传入,终端卡住问题求助
问题:无法将单引号作为命令行参数传入C程序
我无法将单引号(')作为命令行参数传入自己编写的C程序,代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> unsigned int ascii_values (const char *word); int main (int argc, char *argv[]) { if (argc < 2) { printf("Usage: ./ascii WORD\n"); } for (int i = 1; i < argc; i++) { int ascii = ascii_values(argv[i]); printf("The ascii value is %i\n", ascii); } } unsigned int ascii_values (const char *word) { int l = strlen(word); int ascii = 0; for(int i = 0; i < l; i++) { ascii = word[i]; } return ascii; }
当我在终端输入命令:./ascii ' 时,终端会卡在 > 状态,无法得到预期输出 The ascii value is 39.,请问这是什么原因?
原因与解决方法
1. 终端卡住的核心原因
这和C程序本身无关,是Shell的引号语法规则导致的:
在Bash等常见Shell中,单引号是定义字面量字符串的边界符,Shell会把你输入的'判定为未闭合的引号,因此进入多行输入等待状态(显示>提示符),直到你输入配对的闭合单引号才会执行命令。
2. 正确传入单引号的几种方法
要把单引号作为命令行参数传给程序,可用以下几种方式:
- 方法一:反斜杠转义单引号
输入命令:./ascii \'
反斜杠会告知Shell,后续的单引号是普通字符,而非边界符。 - 方法二:双引号包裹单引号
输入命令:./ascii "'"
双引号内部的单引号会被Shell当作普通字符解析。 - 方法三:闭合单引号拼接转义单引号
输入命令:./ascii ''\'''
利用Shell字符串拼接规则:先闭合空单引号,转义中间的单引号,再闭合空单引号,最终拼接出单个单引号字符。
3. 程序的额外逻辑问题
你的ascii_values函数存在逻辑缺陷:循环中每次都会用当前字符的ASCII值覆盖ascii变量,最终只会返回输入字符串最后一个字符的ASCII值。
如果需求是获取单个字符的ASCII值,可简化为直接返回word[0](需先判断字符串非空);如果是计算所有字符的ASCII值之和,应将ascii = word[i]改为ascii += word[i]。
内容的提问来源于stack exchange,提问作者Alex Sugimoto
相关产品推荐
相关产品推荐

