求问,输出汉字的时候VS会报错。该怎么改代码呀,是什么原因导致的,完全摸不着头绪!
题目是输入职工姓名和工号,按工号由小到大排序。
#include <stdio.h>
int main()
{
int str[100] = { 0 };\\存储姓名
int strz[100] = { 0 };\\冒泡法是存储姓名的
int number[100] = { 0 };\\存储工号
int i, j, k;
printf("请输入职工姓名与职工号,以空格分隔:");
for (i = 0; i < 10; i++) {\\读入姓名工号
scanf("%s %d", &str[i], &number[i]);
}
for (i = 0; i < 10; i++) {\\冒泡法
for (j = 0; j < 9 - i; j++) {
if (number[j] > number[j + 1]) {
k = number[j + 1];\\工号的
strz[0] = str[j + 1];\\姓名的
number[j + 1] = number[j];
str[j + 1] = str[j];
number[j] = k;
str[j] = strz[0];
}
}
}
printf("职工按照职工号排序为:\n");
for (i = 0; i < 10; i++) {
printf("%s\n", str[i]);\\输出不了,会报错
}
}
修改如下,改动处见注释,供参考:
#include <stdio.h>
#include <string.h> // 修改
#define N 10 // 修改
int main()
{
char str[N][100] = { 0 }; //存储姓名 int str[100] = { 0 }; 修改
char strz[100] = { 0 }; //存储姓名 int strz[100] = { 0 }; 修改
int number[N] = { 0 }; //存储工号
int i, j, k;
printf("请输入职工姓名与职工号,以空格分隔:");
for (i = 0; i < N; i++) {
//读入姓名工号
scanf("%s %d", str[i], &number[i]); // 修改
//scanf("%s %d", &str[i], &number[i]);
}
for (i = 0; i < N - 1; i++) { //for (i = 0; i < 10; i++) 修改
//冒泡法
for (j = 0; j < N - 1 - i; j++) { // 修改
if (number[j] > number[j + 1]) {
k = number[j + 1]; //工号的
number[j + 1] = number[j];
number[j] = k;
// 修改
strcpy(strz, str[j + 1]); //strz[0] = str[j + 1]; //姓名的
strcpy(str[j + 1], str[j]); //str[j + 1] = str[j];
strcpy(str[j], strz); //str[j] = strz[0];
}
}
}
printf("职工按照职工号排序为:\n");
for (i = 0; i < N; i++) { // 修改
printf("%d %s\n", number[i], str[i]); // 修改
}
return 0;
}
把第4行
int str[100] = { 0 };\\存储姓名
改为
char str[100] = { 0 };\\存储姓名
因为存储多个姓名字符串的str是一维int数组,所以运行时会出错;
将第四行的 int str[100] = { 0 },改为二维字符数组, 即char str[10][100]即可,因为是要存储十个姓名字符串。
修改如下:
参考链接:
#include <stdio.h>
// 复制字符串的简易函数
// 将src里的字符串复制到dest
char * copyStr(char * dest, char * src){
int i =0;
if (dest==NULL || src==NULL){
return NULL;
}
while(src[i]!='\0'){
dest[i] = src[i];
i++;
}
dest[i]='\0';
return dest;
}
int main()
{
// https://blog.csdn.net/qq_41765712/article/details/81740350
char str[10][100] = { 0 };//存储十个姓名字符串的二维字符数组
char temp[100];
int strz[100] = { 0 };//冒泡法是存储姓名的
int number[100] = { 0 };//存储工号
int i, j, k;
printf("请输入职工姓名与职工号,以空格分隔:\n");
for (i = 0; i < 10; i++) {//读入姓名工号
// https://zhuanlan.zhihu.com/p/392136002
scanf("%s %d", &str[i], &number[i]);
}
for (i = 0; i < 10; i++) {//冒泡法
for (j = 0; j < 9 - i; j++) {
if (number[j] > number[j + 1]) {
copyStr(temp,str[j]);
copyStr(str[j],str[j+1]);
copyStr(str[j+1],temp);
k=number[j];
number[j]=number[j+1];
number[j+1]=k;
}
}
}
printf("职工按照职工号排序为:\n");
for (i = 0; i < 10; i++) {
printf("%s\n", str[i]);
}
}
这其实是编码问题,Windows的命令行用的是ANIS编码,但编辑器用的是utf8编码,你这需要用Windows自带的记事本打开->另存为->保存编码选择ANIS编码(所有编码里的第一个)点保存之后再编译就过了.
上图
#include <stdio.h>
#include <cstring>
int main() {
char str[100][32] = {0}; // 字符串数组
int number[100] = {0}; // 工号数组
int i, j, k;
printf("请输入职工姓名与职工号,以空格分隔:\n");
for (i = 0; i < 10; i++) {
scanf("%s %d", str[i], &number[i]); // 读入字符串和工号
}
for (i = 0; i < 10; i++) {
for (j = 0; j < 9 - i; j++) {
if (number[j] > number[j + 1]) {
k = number[j + 1];
char tmp[32]; // 交换字符串用的临时变量
strcpy(tmp, str[j + 1]);
number[j + 1] = number[j];
strcpy(str[j + 1], str[j]);
number[j] = k;
strcpy(str[j], tmp);
}
}
}
printf("职工按照职工号排序为:\n");
for (i = 0; i < 10; i++) {
printf("%s\n", str[i]); // 输出字符串
}
return 0;
}
这题定义结构体或许会更简单
而且你有个错误,你可以把第四行改成char类型的,因为名字可不是整形,是字符型的
具体改法如下:
char str[100] = { 0 };//把int改成char
你可以先采纳一下,我尽量用结构体帮你写写看