C的C输入返回不同的char

时间:2015-12-08 09:06:15

标签: c

我正在学习C而且我偶然发现了一个非常奇怪的问题。当我输入一个char时,它返回1-2个不同的字符。我不知道为什么它会返回不同的字符而不是原始字符。有人可以解释一下为什么它不起作用吗?

此代码的目标是接受4个char输入并返回给定的输入。

代码:

#include <stdio.h>

int main() {

 char c;

 c = getchar();
 getchar();
 c = c + "/0";
 printf("%c\n", c);

 c = getchar();
 getchar();
 c = c + "/0";
 printf("%c\n", c);

 c = getchar();
 getchar();
 c = c + "/0";
 printf("%c\n", c);

 c = getchar();
 getchar();
 c = c + "/0";
 printf("%c\n", c);

 return 0;
}

7 个答案:

答案 0 :(得分:2)

在C中,字符和字符串具有不同的数据类型:字符是整数(通常为8位长,值为-128到128),字符串是字符数组(C样式字符串,其中字符串的结尾由空字符\0或其他形式的数组表示。

字符

如果要将字符存储在char类型的变量中,可以使用以下任何一种:

char c = 'c';        //< Set c to the character 'c'
char c; c = 'h';     //< Set c to the character 'h'
char c = '\65';      //< Set c to the character 'A' (see ASCII codes)
char c = getchar();  //< Store a character from a function returning char
char c = 10;         //< Not always considered good practice (but still valid)

字符串

如果你想在C中使用C风格的字符串,你可以使用:

char szMyString[] = "This is my string"; //< Array of 18 characters
char szAnotherString[5] = "asdf";        //< Array of 5 characters
char szBuf[5];  sprintf(szBuf, "hi");    //< Array len: 5, String len: 2
char szBuf[128]; scanf("%s", szBuf);     //< Ask the user for a string
char szBuf[5]; szBuf[0] = 'a'; szBuf[1] = '\0';  //< String with length 1
char szBuf[5]; szBuf[0] = 'a';    //< Not a string (just an array of type char)

请务必注意,字符使用单引号'以及使用双引号"的字符串以C语言编写。在其他语言(如Python)中,您可以使用双引号或单引号,但大多数情况下可以互换使用,但在C语言中存在差异。

加入字符串

如果要连接两个字符串,则需要确保有足够的空间来包含两个字符串。您可以通过将第二个字符串添加到第一个字符串的末尾来连接两个字符串,或者将两个原始字符串复制到一个新数组中。

// Append to the first string
char szFirst[128] = "The first string...";
char szSecond[] = "and the second string.";
strcat(szFirst, szSecond);

// Copy strings into new array
char szJoined[128];
char szFirst[] = "Hello";
char szSecond[] = "World";
sprintf(szJoined, "%s %s", szFirst, szSecond);

混合字符串和字符

如果要在字符串末尾添加字符,则需要将字符串末尾的空字符替换为新字符,并在字符串后面添加新的空字符。您应首先检查目标字符串是否有足够的空间来容纳新字符。

// By hand
char c = 'A';
char szString[128] = "The capital of a is ";
nOldLength = length(szString);
szString[nOldLength] = c;
szString[nOldLength+1] = '\0';

// Using sprintf
char c = 'H';
char szString[] = "ello";
char szOutput[128];
sprintf(szOutput, "%c%s", c, szString);

答案 1 :(得分:1)

您正在尝试将多个字符存储在单个char变量中,但这不起作用。您的char c存储0到255(无符号)或-127到+128(有符号)的数值。如果你想要一个正确终止的字符串,你必须改变你的代码:

int main(void) {

 char c[2];

 c[0] = getchar();
 getchar();
 c[1] = '\0';
 printf("%s\n", c);

 return 0;
}

答案 2 :(得分:0)

如果您的目标是接受4个字符输入并打印给定的输入,那么只需从代码中删除c = c + "/0";即可。它应该工作

答案 3 :(得分:0)

char仅代表一个字符。将char(此处为c)与string(此处为"\n")添加/连接是没有意义的。

在C中,字符串与"分隔。 char以'分隔。

如果你想用char算术,你的两个操作数都需要char s。

您想要返回原始输入char,因此只需删除

即可
c = c + "\n";

答案 4 :(得分:0)

无需结束输入。如果您正在阅读一个char,那么您可以直接输出它。

printf("%c\n", c);  // Note: %c prints one char

如果要从该char构建字符串,则需要一个终止空字节。

char c[2];
c[0] = getchar();
c[1] = '\0';
printf("%s\n", c);  // Note: %s prints a string (chars until terminating null byte)

答案 5 :(得分:0)

首先

空字符为'\0',而非'/0'

第二

 c = c + "/0";

如上所述,你不能附加字符串。

要进行打印,您无需将其转换为数组并使用printf

用于打印您需要的角色

printf("%c\n", c);  

答案 6 :(得分:0)

根据您的要求,不需要包含以下内容的行:

此外,您还使用了一个getchar(); // This is not needed. c = c + "/0"; // This is not needed. ,这是不需要的。

删除以下行:

#include <stdio.h>

int main() {

 char c;

 c = getchar();
 printf("%c\n", c);

 c = getchar();
 printf("%c\n", c);

 c = getchar();
 printf("%c\n", c);

 c = getchar();
 printf("%c\n", c);

 return 0;
}

所以工作代码是:

case class Test(id: Int, value: String, desc: String)
val data = sc.parallelize(Seq((1, "v1", "d1"), (1, "v2", "d2"), (2, "v21", "d21"), (2, "v22", "d22")))
  .map(line => Test(line._1, line._2, line._3))
  .df

data.registerTempTable("data")
val result = sqlContext.sql("select id,concat_ws(';', collect_list(value)),concat_ws(';', collect_list(value)) from data group by id")
result.show